我有一个包含对象数组的数组。我想从数组中获取唯一的属性值。例如。
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。
答案 0 :(得分:4)
以下是使用下划线flatten,reject,pluck和uniq的解决方案:
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所以我相信它在大型数据集中会更有效率,因为我们不必搜索每次添加项目时都有唯一的数组。
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;
答案 6 :(得分:0)
为您提供运行babel或最新版本的nodejs,您不需要lodash或下划线。
以下示例依赖于a
始终为字符串,因此可以将其用作对象键。
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;
另一种解决方案是使用ES6 Set
。