簡體   English   中英

具有唯一鍵的 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是唯一的。

任何想法 ??

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM