从对象数组中获取唯一的字符串

时间:2016-11-03 13:01:05

标签: javascript underscore.js

我有一个包含对象数组的数组。我想从数组中获取唯一的属性值。例如。

var array =     [
  [
    {
      a: 'ggg'
    },
    {
      a: 'kkk'
    }
  ],
  [
    {
      a: undefined
    }
  ],
  [
    {
      a: 'ddd'
    }
  ],
  [
    {
      a: 'ggg'
    }
  ]
];

会回来:

['ggg', 'kkk', 'ddd']

我正在使用下划线库,这是我尝试的内容:

var list = _.reduce(arr, function(memo, v, k) {
      memo.concat(_.pluck(v, 'a'));
    return memo;
}, []);

console.log('list is ', list);

console.log(_.uniq(list));

但它不起作用。小提琴是here

7 个答案:

答案 0 :(得分:4)

以下是使用下划线flattenrejectpluckuniq的解决方案:

var result = _.chain(array)
    .flatten()
    .pluck('a')
    .reject(_.isUndefined)
    .uniq()
    .value();

答案 1 :(得分:4)

使用ES6,您可以使用Set



var array = [[{ a: 'ggg' }, { a: 'kkk' }], [{ a: undefined }], [{ a: 'ddd' }], [{ a: 'ggg' }]],
    set = new Set();

array.forEach(a => a.forEach(b => b.a && set.add(b.a)));
console.log([...set]);




传统的对象。



var array = [[{ a: 'ggg' }, { a: 'kkk' }], [{ a: undefined }], [{ a: 'ddd' }], [{ a: 'ggg' }]],
    set = Object.create(null);

array.forEach(function (a) {
    a.forEach(function (b) { 
        b.a && (set[b.a] = true);
    })
});
console.log(Object.keys(set));




答案 2 :(得分:0)

您可以循环并手动创建数组

var array = [
  [{
    a: 'ggg'
  }, {
    a: 'kkk'
  }],
  [{
    a: undefined
  }],
  [{
    a: 'ddd'
  }],
  [{
    a: 'ggg'
  }]
];

var result = [];
array.forEach(function(a){
  a.forEach(function(obj){
    if(result.indexOf(obj.a) < 0 && obj.a)
      result.push(obj.a)
  })
})

console.log(result)

答案 3 :(得分:0)

var array = [
  [{
    a: 'ggg'
  }, {
    a: 'kkk'
  }],
  [{
    a: undefined
  }],
  [{
    a: 'ddd'
  }],
  [{
    a: 'ggg'
  }]
];

var values = [];

array.map(function(item) {
  return item.map(function(item2) {
    if(item2.a)
      values.push(item2.a);
  });
});

values = values.filter(function(v, i) {
  return values.indexOf(v) == i;
});

console.log(values);

答案 4 :(得分:0)

我现在看到其他一些人已经过了,但现在我做到了:

https://jsfiddle.net/uc0vot3n/

getClusterListeners()  
getConnectionsPerHost()  
getConnectTimeout()  
getLocalThreshold()

答案 5 :(得分:0)

这是另一种常规解决方案......它没有使用indexOf所以我相信它在大型数据集中会更有效率,因为我们不必搜索每次添加项目时都有唯一的数组。

&#13;
&#13;
var array =     [
  [
    {
      a: 'ggg'
    },
    {
      a: 'kkk'
    }
  ],
  [
    {
      a: undefined
    }
  ],
  [
    {
      a: 'ddd'
    }
  ],
  [
    {
      a: 'ggg'
    }
  ]
];
var map = {};
var uniq = [];

array.forEach(function(items){
    items.forEach(function(item){
        if(item.a) {
            map[item.a] = true;
        }
    });
});

for(var i in map){
    if(map.hasOwnProperty(i)){
        uniq.push(i);
    }
}

console.log(uniq);
&#13;
&#13;
&#13;

答案 6 :(得分:0)

为您提供运行babel或最新版本的nodejs,您不需要lodash或下划线。

以下示例依赖于a始终为字符串,因此可以将其用作对象键。

&#13;
&#13;
var arr = [
  [{
    a: 'ggg'
  }, {
    a: 'kkk'
  }],
  [{
    a: undefined
  }],
  [{
    a: 'ddd'
  }],
  [{
    a: 'ggg'
  }]
];

var list = Object.keys(
  arr.reduce(function flatten(flattened, subarr) {
    return [...flattened, ...subarr]
  }, [])
  .filter(function hasA(obj) { return obj.a != null })
  .reduce(function putAintoAccumlator(accumulator, obj) {
    return {
      ...accumulator, [obj.a]: true
    }
  }, {})
)
console.log(list)
&#13;
&#13;
&#13;

另一种解决方案是使用ES6 Set