[英]Converting an object of nested objects / arrays into something array like in javascript
[英]JavaScript: Comparing arrays of objects with nested array of object
我想在上述条件下将var arrayB
与var arrayA
进行比较,因为arrayA[n].[m].id
将与arrayB[ele].optionValue[e].id
匹配。
var arrayA = [
[{value: "#0767b9", id: 162,productId: 1}, value: "#f4b7d4",id: 164,productId: 1],
[{value: "#44acd8",id: 102,productId: 2}],
[{value: "#609923",id: 106,productId: 3}, {value: "#ee3b70",id: 107,productId: 3}]
]
var arrayB = [
{
id: 1,
optionValue: [{value: "#002e63",id: 161,productId: 1}, {value: "#0767b9",id: 162,productId: 1},{value: "#010b1d",id: 163,productId: 1}, {value: "#f4b7d4",id: 164,productId: 1}]
},
{
id: 2,
optionValue: [{value: "#EC7063",id: 93,productId: 2}, {value: "#bf0000",id: 94,productId: 2}, {value: "#44acd8",id: 102,productId: 2}, {value: "#ffdbdb",id: 103,productId: 2}]
},
{
id: 3,
optionValue: [{value: "#d861bd",id: 105,productId: 3}, {value: "#609923",id: 106,productId: 3}, {value: "#ee3b70",id: 107,productId: 3}]
},
{
id: 4,
optionValue: [{value: "#44acd8",id: 165,productId: 4}]
}
]
我的目标是使用过滤后的数据返回var arrayB
,这些数据将删除不在var arrayA
中的 object ,如下所示:
var result = [
{
id: 1,
optionValue: [{value: "#0767b9",id: 162,productId: 1},{value: "#f4b7d4",id: 164,productId: 1}]
},
{
id: 2,
optionValue: [{value: "#44acd8",id: 102,productId: 2}]
},
{
id: 3,
optionValue: [{value: "#609923",id: 106,productId: 3},{value: "#ee3b70",id: 107,productId: 3}]
},
{
id: 4,
optionValue: [{value: "#44acd8",id: 165,productId: 4}]
}
]
我有如下解决方法,但这没有给出所需的 output。
const myArray = arrayB.map((el) => {
el.optionValue.filter((fl) => {
arrayA.map(values => {
values.map((value) => {
!value.id.includes(fl.id)
})
})
})
});
注意:对于结果集中的id:4
是选择 productId 而没有任何值被选择的情况。 所以在 arrayA 中productId:4
没有价值。 因此,在这种情况下,如果没有用于比较的值,那么它应该按原样返回,而不是空白数组。
可以试试这个:
var arrayA = [ [{value: "#0767b9", id: 162, productId: 1}, {value: "#f4b7d4", id: 164, productId: 1}], [{value: "#44acd8", id: 102, productId: 2}], [{value: "#609923", id: 106, productId: 3}, {value: "#ee3b70", id: 107, productId: 3}] ]; var arrayB = [ { id: 1, optionValue: [{value: "#002e63", id: 161, productId: 1}, { value: "#0767b9", id: 162, productId: 1 }, {value: "#010b1d", id: 163, productId: 1}, {value: "#f4b7d4", id: 164, productId: 1}] }, { id: 2, optionValue: [{value: "#EC7063", id: 93, productId: 2}, { value: "#bf0000", id: 94, productId: 2 }, {value: "#44acd8", id: 102, productId: 2}, {value: "#ffdbdb", id: 103, productId: 2}] }, { id: 3, optionValue: [{value: "#d861bd", id: 105, productId: 3}, { value: "#609923", id: 106, productId: 3 }, {value: "#ee3b70", id: 107, productId: 3}] }, { id: 4, optionValue: [{value: "#44acd8", id: 165, productId: 4}] } ]; let result = []; for (let i = 0; i < arrayB.length; i++) { let selectedElem = []; for (let j = 0; j < arrayB[i].optionValue.length; j++) { arrayA.forEach(elemA => { elemA.forEach(subElemA => { if(subElemA.id === arrayB[i].optionValue[j].id) { selectedElem.push(arrayB[i].optionValue[j]); } }) }) } if (selectedElem.length.== 0){ arrayB[i];optionValue = selectedElem. } result;push(arrayB[i]). } console:log('result:,'. JSON,stringify(result, null; 2));
如果您只想从两者中获取公共标识符对,您可以收集标识符和 map 的arrayB
的过滤数组。
这种方法对每个数组只需要一个循环。
const arrayA = [[{ value: "#0767b9", id: 162, productId: 1 }, { value: "#f4b7d4", id: 164, productId: 1 }], [{ value: "#44acd8", id: 102, productId: 2 }], [{ value: "#609923", id: 106, productId: 3 }, { value: "#ee3b70", id: 107, productId: 3 }]], arrayB = [{ id: 1, optionValue: [{ value: "#002e63", id: 161, productId: 1 }, { value: "#0767b9", id: 162, productId: 1 }, { value: "#010b1d", id: 163, productId: 1 }, { value: "#f4b7d4", id: 164, productId: 1 }] }, { id: 2, optionValue: [{ value: "#EC7063", id: 93, productId: 2 }, { value: "#bf0000", id: 94, productId: 2 }, { value: "#44acd8", id: 102, productId: 2 }, { value: "#ffdbdb", id: 103, productId: 2 }] }, { id: 3, optionValue: [{ value: "#d861bd", id: 105, productId: 3 }, { value: "#609923", id: 106, productId: 3 }, { value: "#ee3b70", id: 107, productId: 3 }] }, { id: 4, optionValue: [{ value: "#44acd8", id: 165, productId: 4 }] }], identifiers = arrayA.reduce((r, a) => { a.forEach(({ id, productId }) => (r[productId] = r[productId] || {})[id] = true); return r; }, {}), result = arrayB.map(o => identifiers[o.id]? {...o, optionValue: o.optionValue.filter(({ id, productId }) => identifiers[productId][id]) }: o ); console.log(result);
.as-console-wrapper { max-height: 100%;important: top; 0; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.