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

Javascript 从对象数组中获取唯一字符串,javascript,underscore.js,Javascript,Underscore.js,我有一个包含对象数组的数组。我想从数组中获取唯一的属性值。例如 var array = [ [ { a: 'ggg' }, { a: 'kkk' } ], [ { a: undefined } ], [ { a: 'ddd' } ], [ { a: 'ggg' } ] ]; 将返回: ['ggg', 'kkk', '

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

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

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

您可以在上面循环并手动创建一个数组

var数组=[
[{
a:‘ggg’
}, {
a:‘kkk’
}],
[{
a:未定义
}],
[{
a:‘ddd’
}],
[{
a:‘ggg’
}]
];
var结果=[];
array.forEach(函数(a){
a、 forEach(功能(obj){
if(result.indexOf(obj.a)<0&&obj.a)
结果推送(obj.a)
})
})
console.log(结果)
var数组=[
[{
a:‘ggg’
}, {
a:‘kkk’
}],
[{
a:未定义
}],
[{
a:‘ddd’
}],
[{
a:‘ggg’
}]
];
var值=[];
array.map(函数(项){
返回item.map(函数(item2){
如果(第2.a项)
推送值(第2.a项);
});
});
值=值。过滤器(函数(v,i){
返回值。indexOf(v)==i;
});

console.log(值)我看到有些人现在已经成功了,但现在我做到了:

var数组=[
[
{
a:‘ggg’
},
{
a:‘kkk’
}
],
[
{
a:未定义
}
],
[
{
a:‘ddd’
}
],
[
{
a:‘ggg’
}
]
];
var uniq=[];
array.map(函数(obj){
目标图(功能(项目){
if(uniq.indexOf(item.a)==-1&&item.a){
统一推送(a项);
}
});
});

控制台日志(uniq)这是一个使用下划线的解决方案,并且:

使用ES6,您可以使用

var数组=[[{a:'ggg'},{a:'kkk'}],{a:undefined}],{a:'ddd'}],{a:'ggg'}]],
集合=新集合();
array.forEach(a=>a.forEach(b=>b.a&&set.add(b.a));

log([…set])这里有一个替代标准的解决方案……它不使用indexOf,因此我相信它在大型数据集中会更有效一些,因为我们不必每次添加项时都搜索唯一的数组

var数组=[
[
{
a:‘ggg’
},
{
a:‘kkk’
}
],
[
{
a:未定义
}
],
[
{
a:‘ddd’
}
],
[
{
a:‘ggg’
}
]
];
var-map={};
var uniq=[];
array.forEach(函数(项){
items.forEach(功能(项目){
如果有的话(项目a){
map[item.a]=真;
}
});
});
用于(映射中的变量i){
if(地图hasOwnProperty(i)){
单向推力(i);
}
}

控制台日志(uniq)如果您运行babel或最新版本的nodejs,则不需要使用lodash或下划线

下面的示例依赖于
a
始终是字符串,因此它可以用作对象键

var-arr=[
[{
a:‘ggg’
}, {
a:‘kkk’
}],
[{
a:未定义
}],
[{
a:‘ddd’
}],
[{
a:‘ggg’
}]
];
var list=Object.keys(
arr.reduce(函数展平(展平,子带){
返回[…变平,…分段]
}, [])
.filter(函数hasA(obj){return obj.a!=null})
.减少(功能putAintoAccumlator(蓄能器,obj){
返回{
…累加器[obj.a]:正确
}
}, {})
)

console.log(列表)
非常好。但没有定义。添加.filter(布尔);最后会过滤掉错误的值,谢谢。添加了一个
拒绝(u.isUndefined)
来摆脱那些讨厌的未定义
var result = _.chain(array)
    .flatten()
    .pluck('a')
    .reject(_.isUndefined)
    .uniq()
    .value();