我试图将大量的对象聚合到单个对象,但我的if语句互相替换:
const obj = [];
res.map((el) => {
if (el.resource.name === "FORM01" && el.name === "cost.ttl") {
obj[el.resource.name] = { [el.name]: el };
}
if ( el.resource.name === "FORM01" && el.name === "cost.use") {
obj[el.resource.name] = { [el.name]: el };
}
});
结果我想加入
obj[el.resource.name] = {}
像cost.ttl
和cost.use
这样的两个领域。
如果你没有使用结果,map
不是循环数组的正确工具。同样,如果要将字符串映射到值(el.resource.name
到对象),则数组不是要使用的正确对象类型。只需使用普通物体或Map
。
两个赋值冲突的原因是第二次条件为真时,它会覆盖您指定的第一个对象。而是创建一个对象,然后根据需要将每个属性添加到同一个对象。
目前尚不清楚你真正想要的最终结果,但也许是这样的:
const obj = {}; // *** Object, not array
res.forEach((el) => { // *** forEach, not map
if (el.resource.name === "FORM01" && (el.name === "cost.ttl" || el.name === "cost.use")) {
// *** Get the existing object if any; create and store a new one if there isn't already one there
const entry = obj[el.resource.name] = obj[el.resource.name] || {};
// *** Add this property to it
entry[el.name] = el;
}
});
或者你可以使用for-of
:
const obj = {};
for (const el of res) {
if (el.resource.name === "FORM01" && (el.name === "cost.ttl" || el.name === "cost.use")) {
const entry = obj[el.resource.name] = obj[el.resource.name] || {};
entry[el.name] = el;
}
});
试试以下
const obj = {}; // Initialize here to an object instead of array
res.map((el) => {
if (el.resource.name === "FORM01" && (el.name === "cost.ttl" || el.name === "cost.use")) {
// Check for existing object, else create new object
obj[el.resource.name] = obj[el.resource.name] || {};
obj[el.resource.name][el.name] = el; // set the value in object
}
});
注意,Array.map
不是这里迭代的正确选择,因为你试图遍历数组并在条件上得到一些值并存储它。您可以使用简单的for循环,也可以使用forEach
。
连续避免使用两个if
语句,因为第一个语句可能会影响第二个语句测试的数据。
此外,obj
应该是一个Object,而不是一个Array。
另外,使用.forEach
,而不是.map
,因为你没有从循环中返回任何东西。
const obj = {};
res.forEach( el => {
if (el.resource.name === "FORM01" && ["cost.ttl","cost.use"].includes(el.name)) {
obj["FORM01"] = { [el.name]: el };
}
});