javascript和具有唯一密钥的es6过滤器数组

javascript and es6 filter array with unique key

本文关键字:es6 过滤器 数组 密钥 唯一 javascript      更新时间:2023-09-26

我在变量中有一个列表,比如:

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