如何从对象数组获取唯一值

时间:2019-06-04 19:24:36

标签: javascript

我有一个映射的数组对象,现在我需要从该数组的子级获取唯一值。

const arr=[
            {
              name: 'name1',
              functions:{
                0:{
                  name:'some1',
                  property: 'string'
                },
                1:{
                  name:'some1',
                  property: 'string'
                },
                2:{
                  name:'some3',
                  property: 'number'
                }
              }
            },
          ]


<div>
          {
              arr.map((item, index) => {
                  let ars=[]
                  //console.log(item.functions)
                  for(const key in item.functions){                
                    if(ars.indexOf(item.functions[key])>1){
                        ars.push(item.functions[key])
                    }
                  }
                  console.log(ars)
              return <div key={index}>
                <h2>{item.name}</h2>
                {
                    ars.map((i)=>(
                        <p>{i.name}</p>
                    ))
                }

              </div>
          })
          }
          </div>

我需要获取如下值: some1 some3

因此,我只需要从属性字符串中获得一个名称。对于数字,只有一个名字。

2 个答案:

答案 0 :(得分:1)

您可以为property创建一个Set。如果尚未添加property,请将属性的name添加到数组中。

const arr = [{
  name: 'name1',
  functions: {
    0: {
      name: 'some1',
      property: 'string'
    },
    1: {
      name: 'some2',
      property: 'string'
    },
    2: {
      name: 'some3',
      property: 'number'
    }
  }
}]

const propertySet = new Set,
      names = []

for (const { functions } of arr) {
  Object.values(functions).forEach(o => {
    if (!propertySet.has(o.property)) {
      names.push(o.name);
      propertySet.add(o.property)
    }
  })
}

console.log(names)

答案 1 :(得分:0)

如果基于property的字符串表示形式的唯一性就足够了,并且name的值始终是真实的,则可以使用以下代码:

const arr = [{name: 'name1', functions: {0: {name: 'some1', property: 'string'}, 1: {name: 'some2', property: 'string'}, 2: {name: 'some3', property: 'number'}}}];

let lookup = {};
arr.forEach(obj => {
  Object.values(obj.functions).forEach(func => {
    lookup[func.property] || (lookup[func.property] = func.name);
  });
});

console.log(Object.values(lookup));

注意:由于使用了字符串表示形式,因此该解决方案将property: 123property: "123"视为相同的值。如果以下是选项name: ""name: null等,则使用第一个真实的name,如果不存在真实的名称,则使用最后一次出现的name代替。