繁体   English   中英

JavaScript:比较对象的 arrays 与嵌套数组 object

[英]JavaScript: Comparing arrays of objects with nested array of object

我想在上述条件下将var arrayBvar 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM