[英]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
是唯一的。
任何想法 ??
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'));
我在這里看不到的另一種方法是使用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(
而不是專門需要找到的第一個對象。
過濾以僅保留名稱第一次出現的那些元素(換句話說,其索引與第一次出現的索引相同):
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)
)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.