我正在一个ReactJS应用程序中工作,在其中我检索了一些产品的JSON,并且我需要重新构造此信息以进行分类和显示该信息。
我已经尝试过使用过滤器和地图,但结果没有达到预期。
[
{
"barcode": "8434786768366",
"collection": "AW",
"colorCode": "413",
"colorName": "LIGHT WINE",
"familyCode": "1",
"familyName": "T-Shirts",
"genericProduct": "PM506471",
"id": 263917,
"productCode": "PM506471413S",
"productName": "T-SHIRT",
"productNameLang": "en",
"season": "2019",
"size": "S",
"subfamilyName": "SS T-Shirts"
},
{
"barcode": "8434786768342",
"collection": "AW",
"colorCode": "413",
"colorName": "LIGHT WINE",
"familyCode": "1",
"familyName": "T-Shirts",
"genericProduct": "PM506471",
"id": 263921,
"productCode": "PM506471413L",
"productName": "T-SHIRT",
"productNameLang": "en",
"season": "2019",
"size": "L",
"subfamilyName": "SS T-Shirts"
}
]
这是我正在使用的示例,尽管原始数组要大得多。我需要能够找到具有相同“ genericProduct”的所有对象,并将它们合并到一个对象中,以便删除重复项。但是,我需要保留信息而不是覆盖信息。
按照上面的示例,这两个对象应合并为以下内容:
[
{
"barcode": ["8434786768366", "8434786768342"],
"collection": "AW",
"colorCode": "413",
"colorName": "LIGHT WINE",
"familyCode": "1",
"familyName": "T-Shirts",
"genericProduct": "PM506471",
"id": [263917, 263917],
"productCode": ["PM506471413S","PM506471413L"],
"productName": "T-SHIRT",
"productNameLang": "en",
"season": "2019",
"size": ["S","L"],
"subfamilyName": "SS T-Shirts"
}
]
作为 tl; dr ,我需要在对象数组中进行迭代以查看哪个具有相同的“ genericProduct”键,然后检查每个属性以查看其是否不同。如果是这样,我需要将所述属性转换为一个存储所有值(两个或多个)的数组。
答案 0 :(得分:3)
遍历数组,并为每个item
声明一个空对象。现在,检查整个数组是否存在该对象中的重复项,并将重复的property
合并到数组中。
const items = [
{
"barcode": "8434786768366",
"collection": "AW",
"colorCode": "413",
"colorName": "LIGHT WINE",
"familyCode": "1",
"familyName": "T-Shirts",
"genericProduct": "PM506471",
"id": 263917,
"productCode": "PM506471413S",
"productName": "T-SHIRT",
"productNameLang": "en",
"season": "2019",
"size": "S",
"subfamilyName": "SS T-Shirts"
},
{
"barcode": "8434786768342",
"collection": "AW",
"colorCode": "413",
"colorName": "LIGHT WINE",
"familyCode": "1",
"familyName": "T-Shirts",
"genericProduct": "PM506471",
"id": 263921,
"productCode": "PM506471413L",
"productName": "T-SHIRT",
"productNameLang": "en",
"season": "2019",
"size": "L",
"subfamilyName": "SS T-Shirts"
}
]
const result = []
const obj = {}
items.map(item =>{
Object.keys(item).map(key =>{
if(obj[key] && obj[key] !== item[key])
return obj[key] = [obj[key], item[key]].flat()
return obj[key] = item[key]
})
})
result.push(obj)
console.log(result)
答案 1 :(得分:2)
您在这里!我做了两个假设:
您可能在正确的方向上查看Array
方法。也许您错过了看reduce
的机会?
const data = [
{
barcode: "8434786768366",
collection: "AW",
colorCode: "413",
colorName: "LIGHT WINE",
familyCode: "1",
familyName: "T-Shirts",
genericProduct: "PM506471",
id: 263917,
productCode: "PM506471413S",
productName: "T-SHIRT",
productNameLang: "en",
season: "2019",
size: "S",
subfamilyName: "SS T-Shirts"
},
{
barcode: "8434786768342",
collection: "AW",
colorCode: "413",
colorName: "LIGHT WINE",
familyCode: "1",
familyName: "T-Shirts",
genericProduct: "PM506471",
id: 263921,
productCode: "PM506471413L",
productName: "T-SHIRT",
productNameLang: "en",
season: "2019",
size: "L",
subfamilyName: "SS T-Shirts"
},
{
barcode: "8434786768342",
collection: "AW",
colorCode: "413",
colorName: "LIGHT WINE",
familyCode: "1",
familyName: "T-Shirts",
genericProduct: "PM506471",
id: 263921,
productCode: "PM506471413L",
productName: "T-SHIRT",
productNameLang: "en",
season: "2019",
size: "L",
subfamilyName: "SS T-Shirts"
}
];
const result = data.reduce((acc, product) => {
const merged = Object.keys(product)
.filter(key => acc[key] !== product[key])
.reduce(
(mergedObject, key) => ({
...mergedObject,
[key]:
acc[key] instanceof Array
? acc[key].concat([product[key]])
: [acc[key], product[key]]
}),
{}
);
return {
...acc,
...merged
};
});
console.log(result);
更新简化并使用更好的变量名
答案 2 :(得分:0)
如果属性存在或值存在,或者值在数组内部,则可以获取条目和chck。
否则,分配值或使用以前的值和实际值创建一个数组。
var data = [{ barcode: "8434786768366", collection: "AW", colorCode: "413", colorName: "LIGHT WINE", familyCode: "1", familyName: "T-Shirts", genericProduct: "PM506471", id: 263917, productCode: "PM506471413S", productName: "T-SHIRT", productNameLang: "en", season: "2019", size: "S", subfamilyName: "SS T-Shirts" }, { barcode: "8434786768342", collection: "AW", colorCode: "413", colorName: "LIGHT WINE", familyCode: "1", familyName: "T-Shirts", genericProduct: "PM506471", id: 263921, productCode: "PM506471413L", productName: "T-SHIRT", productNameLang: "en", season: "2019", size: "L", subfamilyName: "SS T-Shirts" }],
result = data.reduce((r, o) => {
Object.entries(o).forEach(([k, v]) => {
if (!(k in r)) return r[k] = v;
if (r[k] === v || Array.isArray(r[k]) && r[k].includes(v)) return;
r[k] = [].concat(r[k], v);
});
return r;
}, {});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }