根据对象的内部数组减少对象数组



我有一个这样的数据集:

[
{
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,productTypevariants[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; }

最新更新