问题描述
假设我具有以下对象数组:
const contents = [
{
"id": 1,"category": ["cat1","cat2"],"subcategory": ["subcat1"],"other": "lorem ipsum"
},{
"id": 2,"category": ["cat2"],"subcategory": ["subcat2"],{
"id": 3,"category": ["cat3"],"subcategory": ["subcat1","subcat2"],"other": "lorem ipsum"
}
]
我需要为上述数组做两件事。第一个是创建唯一类别值的数组。我设法通过以下代码做到了这一点:
let categories = contents.reduce(
(arr,ele) => (
[].push.apply(
arr,ele.category.filter(v => arr.indexOf(v) == -1)
),arr),[]
);
[
{
"category": "cat1","subcategory": "subcat1"
},{
"category": "cat2","subcategory": "subcat2"
},{
"category": "cat3","subcategory": "subcat2"
}
]
解决方法
您可以将Array#flatMap
与嵌套映射一起使用。
const contents = [{ id: 1,category: ["cat1","cat2"],subcategory: ["subcat1"],other: "lorem ipsum" },{ id: 2,category: ["cat2"],subcategory: ["subcat2"],{ id: 3,category: ["cat3"],subcategory: ["subcat1","subcat2"],other: "lorem ipsum" }],result = contents.flatMap(({ category,subcategory }) =>
category.flatMap(category =>
subcategory.map(subcategory => ({ category,subcategory }))
)
);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
,
您可以拥有一个类别-子类别对的列表,过滤唯一的对,然后映射到预期的结果
const contents = [
{
id: 1,category: ['cat1','cat2'],subcategory: ['subcat1'],other: 'lorem ipsum'
},{
id: 2,category: ['cat2'],subcategory: ['subcat1','subcat2'],{
id: 3,category: ['cat3'],other: 'lorem ipsum'
}
]
const res = contents
.flatMap(content => {
const catSubcat = []
for (const cat of content.category) {
for (const subcat of content.subcategory) {
catSubcat.push([cat,subcat])
}
}
return catSubcat
})
.reduce(
(acc,el) =>
acc.find(aEl => aEl[0] === el[0] && aEl[1] === el[1])
? acc
: [...acc,el],[]
)
.map(([category,subcategory]) => ({ category,subcategory }))
console.log(res)
,
您可以使用getCombo()
函数获得元素的组合。
然后对组合的每个对象进行字符串化处理,并使用Set
进行测试,如果不在Set
中,则将其添加到Set
中,并将该对象添加到累加器数组中:>
var contents = [{ id: 1,other: "lorem ipsum" }];
function getUniqueCombo(contents) {
return contents.reduce((acc,{
category,subcategory
}) => {
const combo = getCombo(category,subcategory);
combo.forEach(c => {
const u = JSON.stringify(c);
if (!acc.unique.has(u)) {
acc.unique.add(u);
acc.comb.push(c);
}
});
return acc;
},{
comb: [],unique: new Set()
}).comb;
}
function getCombo(arrOne,arrTwo) {
return arrOne.flatMap(a => arrTwo.map(b => ({
category: a,subcategory: b
})));
}
console.log(getUniqueCombo(contents));