我有一个这样的数据集:
[
{
id: 'abc',
productType: "Nappies"
variants: ['3 Pack of Nappies', 'small']
},
{
id: 'abc',
productType: "Nappies"
variants: ['6 Pack of Nappies', 'small']
},
{
id: 'abc',
productType: "Nappies"
variants: ['12 Pack of Nappies', 'small']
},
{
id: 'abc',
productType: "Nappies"
variants: ['3 Pack of Nappies', 'medium']
},
{
id: 'abc',
productType: "Nappies"
variants: ['6 Pack of Nappies', 'medium']
},
{
id: 'abc',
productType: "Nappies"
variants: ['12 Pack of Nappies', 'medium']
},
{
id: 'def',
productType: "Wipes"
variants: ['3 Pack of Wipes']
},
{
id: 'def',
productType: "Wipes"
variants: ['6 Pack of Wipes']
},
{
id: 'def',
productType: "Wipes"
variants: ['12 Pack of Wipes']
},
]
可以看到,每个产品id在所有变体中都是重复的。我需要减少数据,这样每个产品只有一个版本的"X包尿布",例如:
预期的结果:
[
{
id: 'abc',
productType: "Nappies"
variants: ['3 Pack of Nappies', 'small']
},
{
id: 'abc',
productType: "Nappies"
variants: ['6 Pack of Nappies', 'small']
},
{
id: 'abc',
productType: "Nappies"
variants: ['12 Pack of Nappies', 'small']
},
{
id: 'def',
productType: "Wipes"
variants: ['3 Pack of Wipes']
},
{
id: 'def',
productType: "Wipes"
variants: ['6 Pack of Wipes']
},
{
id: 'def',
productType: "Wipes"
variants: ['12 Pack of Wipes']
},
]
每个变量的次要变量(尺寸,例如"小"/"中")并不重要。我已经尝试运行一个减少函数,运行一个过滤器,并返回true,如果减少对象的"变体"属性包括任何活动对象的"变体"属性,但它返回一切。
const RemoveDuplicates = (array) => {
return array.reduce((arr, item) => {
const removed = arr.filter((obj) => {
return obj.selectedOptions.some((i) =>
item.selectedOptions.includes(i)
)
})
return [...removed, item]
}, [])
}
你所要做的就是找到符合以下条件的accumulator
相同的id
,相同的productType
和相同的variants[0]
- 使用
Array.reduce
遍历数组。 - 第一个参数
acc
是accumulator,用于保存累加列表。下一个参数curr
是当前值,它在循环时保存数组的每个节点。你所要做的是,如果满足要求,将当前值推送到累加器。 - 要检查要求,您必须检查
acc
中的每个curr
值。如果在accumulator
中有一个节点与每个curr
具有相同的id
,productType
和variants[0]
,您称之为版本。如果累加器已经有匹配组合的节点,不要将当前值推入accumulator
。
const input = [
{ id: 'abc', productType: "Nappies", variants: ['3 Pack of Nappies', 'small'] },
{ id: 'abc', productType: "Nappies", variants: ['6 Pack of Nappies', 'small'] },
{ id: 'abc', productType: "Nappies", variants: ['12 Pack of Nappies', 'small'] },
{ id: 'abc', productType: "Nappies", variants: ['3 Pack of Nappies', 'medium'] },
{ id: 'abc', productType: "Nappies", variants: ['6 Pack of Nappies', 'medium'] },
{ id: 'abc', productType: "Nappies", variants: ['12 Pack of Nappies', 'medium'] },
{ id: 'def', productType: "Wipes", variants: ['3 Pack of Wipes'] },
{ id: 'def', productType: "Wipes", variants: ['6 Pack of Wipes'] },
{ id: 'def', productType: "Wipes", variants: ['12 Pack of Wipes'] },
];
const output = input.reduce((acc, curr) => {
const node = acc.find((item) =>
item.id === curr.id &&
item.productType === curr.productType &&
item.variants[0] === curr.variants[0]);
if(!node) {
acc.push(curr)
}
return acc;
}, []);
console.log(output);
您可以使用组合键作为标准的分组by来执行此操作,但不是累积,而是使用该键作为重复项的检查。
const input = [ { id: 'abc', productType: "Nappies", variants: ['3 Pack of Nappies', 'small'] }, { id: 'abc', productType: "Nappies", variants: ['6 Pack of Nappies', 'small'] }, { id: 'abc', productType: "Nappies", variants: ['12 Pack of Nappies', 'small'] }, { id: 'abc', productType: "Nappies", variants: ['3 Pack of Nappies', 'medium'] }, { id: 'abc', productType: "Nappies", variants: ['6 Pack of Nappies', 'medium'] }, { id: 'abc', productType: "Nappies", variants: ['12 Pack of Nappies', 'medium'] }, { id: 'def', productType: "Wipes", variants: ['3 Pack of Wipes'] }, { id: 'def', productType: "Wipes", variants: ['6 Pack of Wipes'] }, { id: 'def', productType: "Wipes", variants: ['12 Pack of Wipes'] },];
const output = Object.values(input.reduce((a, c) => {
const key = `${c.id}_${c.productType}_${c.variants[0]}`;
if (!a.hasOwnProperty(key)) {
a[key] = {...c};
}
return a;
}, {}));
console.log(output);
.as-console-wrapper { max-height: 100% !important; top: 0; }