Estoy tratando de hacer un guión que
.
let url1 = 'http://localhost/myproject/results?id=0001&area=eiffel+tower&city=Paris&whatever=else';
function URLToArray(url) {
var request = {};
var pairs = url.substring(url.indexOf('?') + 1).split('&');
for (var i = 0; i < pairs.length; i++) {
if(!pairs[i])
continue;
var pair = pairs[i].split('=');
request[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
}
console.log(request); // { id: '0001', area: 'eiffel+tower', city: 'Paris', whatever: 'else' }
return(request);
}
let paramsObj = URLToArray(url1);
console.log(paramsObj) // { id: '0001', area: 'eiffel+tower', city: 'Paris', whatever: 'else' }
// Step 3 below, where the issue is and I expect
// id === '0001' && area === 'eiffel+tower' && city === 'Paris' && something === 'else'
paramsObj.forEach((item) => {
let condition = '';
let keys = Object.keys(item);
keys.map((k) => {
if (condition) {
condition += ` && ${k} === '${item[k]}'`
} else {
condition = `${k} === '${item[k]}'`
}
})
console.log(condition);
})
Salidas
paramsObj.forEach((item) => { TypeError: paramsObj.forEach is not a function at Object.<anonymous>
Esperado en console.log(condition)
id === '0001' && area === 'eiffel+tower' && city === 'Paris' && whatever === 'else'
Nota : si el objeto estuviera entre corchetes [ ] , el resultado sería el esperado. Sin embargo URLToArray(url) genera un objeto sin corchetes.
El método ForEach es un método de matriz y está tratando de usarlo en un objeto, probablemente debería crear una función que tome un objeto como uno de sus parámetros.
function ProcessItem(item) {
let condition = '';
let keys = Object.keys(item);
keys.map((k) => {
if (condition) {
condition += ` && ${k} === '${item[k]}'`
} else {
condition = `${k} === '${item[k]}'`
}
})
console.log(condition);
}
Considera lo siguiente.
var url1 = 'http://localhost/myproject/results?id=0001&area=eiffel%20tower&city=Paris&whatever=else';
function getQueryFromURL(u) {
var r = {};
var parts;
if (u.indexOf("?") > -1) {
parts = u.substr(u.indexOf("?") + 1).split("&");
$.each(parts, function(i, v) {
r[v.split("=")[0]] = decodeURI(v.split("=")[1]);
});
}
return r;
}
function objJoin(o, a, b) {
var r = "";
var arr;
$.each(o, function(k, v) {
if (r.length == 0) {
r += [k, a, v].join(" ");
} else {
r += " " + [b, k, a, v].join(" ");
}
});
return r;
}
let paramsObj = getQueryFromURL(url1);
console.log(paramsObj);
console.log(objJoin(paramsObj, "===", "&&"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Esto no hace nada muy diferente, solo hace un mejor uso de las herramientas disponibles para obtener el mismo resultado.
URLToArray() devuelve un objeto y no una matriz. No puede usar forEach en una instancia de un objeto.
En su lugar, es posible que desee iterar sobre las claves, como las siguientes:
Object.keys(paramsObj).forEach((key) => {
const value = paramsObj[key];
let condition = '';
if (condition) {
condition += ` && ${key} == ${value}`;
} else {
condition = `${key} == ${value}`;
}
);