javascript和具有唯一密钥的es6过滤器数组
javascript and es6 filter array with unique key
我在变量中有一个列表,比如:
var name_list = some_list
console.log(name_list)
Array[3]
0: Object
name: "Johny"
1: Object
name: "Monty"
2: Object3:
name: "Johny"
我想得到带有non repetitive
列表的列表。我该怎么做?
更新
我试过这个。。
var unique_name = [ ...new Set(name_list.map(name => {
return name.name
}))]
它工作得很好,但我希望根据名称筛选出唯一的object
。
知道吗??
我在这里没有看到的另一种方法是使用Map
var name_list = [{name: "Johny"}, {name: "Monty"}, {name: "Johny"}];
// Make a mapping of name to object, then pullout objects.
var name_map = new Map(name_list.map(o => [o.name, o]));
var unique_names = [...name_map.values()];
注意,这将为每个名称使用最后一个对象,而不是第一个,但您可以始终使用name_list.slice().reverse().map(
,而不需要特别找到第一个对象。
reduce
在数组上保持对以前条目的查找以进行检查。
const arr=[{name:"Johny"},{name:"Monty"},{name:"Johny"}];
function dedupeByKey(arr, key) {
const tmp = {};
return arr.reduce((p, c) => {
const k = c[key];
if (tmp[k]) return p;
tmp[k] = true;
return p.concat(c);
}, []);
}
console.log(dedupeByKey(arr, 'name'));
或者您可以使用类似的方法filter
:
const arr=[{name:"Johny"},{name:"Monty"},{name:"Johny"}];
function dedupeByKey(arr, key) {
const temp = arr.map(el => el[key]);
return arr.filter((el, i) =>
temp.indexOf(el[key]) === i
);
}
console.log(dedupeByKey(arr, 'name'));
过滤以只保留名称第一次出现的元素(换句话说,其索引与第一次出现时的索引相同):
var name_list = [{name: "Johny"}, {name: "Monty"}, {name: "Johny"}];
var filtered = name_list . filter(
(elt, i, a) => i === a.findIndex(
elt2 => elt.name === elt2.name
)
);
document.getElementById('result').textContent = JSON.stringify(filtered);
<pre id='result'></pre>
这可能不是最快的方法,但可能是最简单的方法。
您可以使用这个distinctByProp( theArray, propertyName)
小函数。
我希望它能帮助
distinctByProp = (theArray, prop) => {
let tempArray = [];
let isFound = obj => tempArray.find( n => n[prop] === obj[prop]);
theArray.forEach( current => !isFound(current) && tempArray.push(current));
return tempArray;
}
用法如下:
let names_list = [{name: "Johny"}, {name: "Johnyh"}, {name: "Max"}, {name: "Monty"}, {name: "Johnyh"}, {name: "Max"}];
let distinct = distinctByProp(names_list, "name");
console.log(distinct);
我希望它能帮助
您可以使用Array#filter()
。
var name_list = [{ name: "Johny" }, { name: "Monty" }, { name: "Johny" }],
filtered = name_list.filter(a => {
this.my = this.my || Object.create(null);
if (!this.my[a.name]) {
this.my[a.name] = true;
return true;
}
});
document.write('<pre>' + JSON.stringify(filtered, 0, 4) + '</pre>');
这是我恢复的这种类型的唯一形式。不仅针对一个字段,而且针对对象的所有根字段。
const unique = l => l.filter(
(e1, i, a) => i === a.findIndex(
e2 => Object.keys(e1)
.map(x => e1[x] === e2[x])
.reduce((x,y) => x && y)
)
)
相关文章:
- ES6构造函数返回基类的实例
- 如何在下面的ES6循环中获得前面的文本
- es6 相当于下划线查找位置
- 为什么我的d3.jsselectAll+过滤器没有过滤
- Angularjs-utils高亮过滤器在搜索时破坏应用程序
- Angular-表的多列过滤器
- 如何在Javascript/ES6中的Aurelia浏览器应用程序中使用AWS S3
- 如何“;过滤器”;或者以其他方式重构该数据
- Angularjs通过过滤器获取indexOf
- ES6生成器:.next()的输入值
- ui网格日期单元格过滤器,过滤日期格式导致显示错误的日期
- 使用按钮的Angular UI网格过滤器
- 简单的ES6承诺问题-交换解决和拒绝参数
- 映射数组ES6时考虑空值
- @@(“at at”)在ES6 JavaScript中是什么意思
- 在ES6中,模块将导致多个网络调用,因为两个模块不能在单个文件中定义
- ES6是否引入了一种机制来生成块范围的函数语句(而不是表达式)
- KendoUI网格行过滤器,带有布尔值下拉列表
- javascript和具有唯一密钥的es6过滤器数组
- 如何修复“仅在ES6中可用”的过滤器错误