JavaScript将项目归为一个项目

时间:2018-09-10 23:39:42

标签: javascript

我有以下数组

var data = [
      {material:1, item:'A'}
      {material:2, item:'B'}
       {material:1, item:'C'}
      {material:1, item:'D'}
  ]

期待的是获得此阵列对象中的材料

所以我希望最终的解决方案是一个只有1和2的数组

var materials = [1,2]

所以现在被困在这里

data.forEach((item)=>{
    //here am stuck on how to proceed
 })

4 个答案:

答案 0 :(得分:3)

如果您使用的是ES6,则可以使用Set。

var materials = new Set(data.map(d => d.material));

如果愿意,您可以轻松地将该集转换回数组。

答案 1 :(得分:2)

reduce变成Set,然后将集合变回数组。另外请注意,您需要修复data的语法-数组项需要用逗号分隔:

var data=[{material:1,item:'A'},
{material:2,item:'B'},
{material:1,item:'C'},
{material:1,item:'D'}];

const set = data.reduce((set, { material }) => set.add(material), new Set());
console.log([...set]);

答案 2 :(得分:0)

您要做什么:

var data = [{
  material: 1,
  item: 'A'
}, {
  material: 2,
  item: 'B'
}, {
  material: 1,
  item: 'C'
}, {
  material: 1,
  item: 'D'
}]

var materials = [];

data.forEach(function(elem) {
  var material = elem.material;
  if (materials.includes(material)) {} else {
    materials.push(material);
  }
})
console.log(materials)

如果您需要任何说明,请告诉我。

答案 3 :(得分:0)

每个人都已经指出了使用Set的明显答案。这可以说是一种更灵活的方法。

const data = [
  { material:1, item:'A' },
  { material:2, item:'B' },
  { material:1, item:'C' },
  { material:1, item:'D' }
]

const map = data.reduce((acc, { material, item }) => {
  acc[material] = material in acc
    ? [ ...acc[material], item ]
    : [ item ]

  return acc
}, {})

// materials and items made of that material
console.log(map) // { 1: [ 'A', 'C', 'D' ], 2: [ 'B' ] }

// unique materials
console.log(Object.keys(map)) // [ '1', '2' ]

如果您需要执行更多操作(如查找所有由X元素制成的材料),从长远来看,这将提高性能。不用过滤,您只需要data[material]