数组中的不同对象根据特定值

时间:2017-05-09 07:40:09

标签: javascript

我想知道如何获得具有不同对象的对象数组。 我正在管理一个我们不断修改的数据库,我们希望对对象进行持续修改以显示它们。 我正在使用NeDB,我们不能使用不同的值,因此我有一个按日期排序的对象数组,但我不知道如何获取具有唯一名称的对象数组。

不同的对象意味着:

想象一下,我有3个像

这样的对象
{name: "Toto", modif: "added", createdAt : "05/08/2017"}
{name: "Toto", modif: "updated", createdAt: "05/09/2017"}
{name: "Toto", modif: "deleted", createdAt: "05/10/2017"}

我想在这里保留第一个Toto。

我们不关心那个日期,因为对象数组已按日期排序。

3 个答案:

答案 0 :(得分:2)

您可以使用哈希表为相同的命名对象保留标志并过滤给定的数组。

var objects = [{ name: "Toto", modif: "added", createdAt: "05/08/2017" }, { name: "Toto", modif: "updated", createdAt: "05/09/2017" }, { name: "Toto", modif: "deleted", createdAt: "05/10/2017" }],
    unique = objects.filter(function (hash) {
        return function (o) {
            if (!hash[o.name]) {
                hash[o.name] = true;
                return true;
            }
        };
    }(Object.create(null)));

console.log(unique);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

过滤数组以仅包含这些元素,以便搜索具有该名称的数组中的第一个元素,从而产生该元素。

data.filter(elt => data.find(elt2 => elt.name === elt2.name) === elt)

答案 2 :(得分:0)

IMO解决此问题的最有效方法是在保持为密钥设置的第一个值的同时,通过您关心的密钥减少数组。



var uniqueObjectsByKey = function(array, key){
  return Object.values(array.reduce(function(obj, value) { 
    obj[value[key]] = obj[value[key]] !==undefined ? obj[value[key]] : value; 
    return obj 
  }, {}))
}
    
var array = [
  {name: "Toto", modif: "added", createdAt : "05/08/2017"},
  {name: "Toto", modif: "updated", createdAt: "05/09/2017"},
  {name: "Toto", modif: "deleted", createdAt: "05/10/2017"}
]
    
uniqueObjectsByKey(array, 'Toto')




或者,如果你想要一个ES6一行,其中YOUR_ARRAY是你的对象数组,而FILTER_KEY是你想要唯一对象的键:

Object.values(YOUR_ARRAY.reduce((obj, value) => ({[value[FILTER_KEY]]]: value[FILTER_KEY], ...obj }), {}))