根据另一个对象数组创建唯一值的新javascript对象数组

问题描述

假设我具有以下对象数组:

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));

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...