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