过滤数组以删除JS中的重复项

时间:2017-11-12 22:50:57

标签: javascript arrays

我已经浏览了很多帖子,并且已经解决了这个问题太久了。要点是,如果存在重复的对象id,我想过滤一个数组,并返回值较低的对象或" val"否则返回原始元素。

开始于:

**编辑输入以便澄清

let input = [
    {"id": 1, "val": 3},
    {"id": 2, "val": 1},
    {"id": 3, "val": 4},
    {"id": 1, "val": 0}
]

function removeDuplicates(array, propertyName) {
    // where propertyName is "id"
}

该功能的结果应为:

[
    {"id": 1, "val": 0},
    {"id": 2, "val": 1},
    {"id": 3, "val": 4}
]

5 个答案:

答案 0 :(得分:2)

解决此类问题的一种常见方法是创建一个临时对象,该对象使用公共属性作为键,将完整对象用作值。

一旦遍历数据数组并构建对象,那么将值放入结果数组是一个简单的过程

let input = [
    {"id": 1, "val": 0},
    {"id": 2, "val": 0},
    {"id": 3, "val": 0},
    {"id": 1, "val": 1}
]

let tmp = {}

input.forEach(o=> {
  tmp[o.id] = tmp[o.id] || o;
  // assign lower value if applicable
  if( o.val < tmp[o.id].val){         
    tmp[o.id].val = o.val;
  }
});

let res = Object.values(tmp);

console.log(res);

答案 1 :(得分:0)

最有效的方法是简单地使用临时对象来存储数组中的所有对象,并将id作为对象键,因为对象键不能重复,多次出现只会相互覆盖直到最后你才会必须使用Object.values(obj)将对象转换回数组。

var input = [
    {"id": 1, "val": 0},
    {"id": 2, "val": 0},
    {"id": 3, "val": 0},
    {"id": 1, "val": 1}
];
function removeDuplicates(array, propertyName) {
    var tmp = {};
    array.forEach(function (v) {
        if (tmp[v[propertyName]] == null) {
            tmp[v[propertyName]] = v;
        } else if (v.val < tmp[v[propertyName]].val)
            tmp[v[propertyName]] = v;
        }
    });
    return Object.values(tmp);
}

使用此:

removeDuplicates(input, "id");

要返回以下内容:

[
    {"id": 1, "val": 0},
    {"id": 2, "val": 0},
    {"id": 3, "val": 0}
]

答案 2 :(得分:0)

您可以使用reduce,然后在累加器中检查当前值是否小于您已保存的值。

let input = [
    {"id": 1, "val": 0},
    {"id": 2, "val": 0},
    {"id": 3, "val": 0},
    {"id": 1, "val": 1}
]

function removeDuplicates(array, propertyName) {
    return array.reduce((acc, cv) => {
        if (acc.hasOwnProperty(cv[propertyName])) {
            if (cv.val < acc[cv[propertyName]].val)
                acc[cv[propertyName]] = cv;
        } else
            acc[cv[propertyName]] = cv;
        return acc;
    }, {});
}
console.log(removeDuplicates(input,"id"))

答案 3 :(得分:0)

使用.filter.map

inputs
    .filter(object => object.id == propertyValue) // get only the objects you want
    .map(object => object.val)                    // convert each object to it's value
    .sort()                                       // sort it
    [0]                                           // and get the first (meaning smallest) element

答案 4 :(得分:0)

您可以使用Array.reduce从最低值构建新哈希,然后只返回该哈希值。

var input = [
  {"id": 1, "val": 0},
  {"id": 2, "val": 0},
  {"id": 3, "val": 0},
  {"id": 1, "val": 1}
];

function minFromArray(ar) {
  //Object.values returns the values of a hash as an array.
  return Object.values(ar.reduce(function(acc, obj){
    //If this is the first instance of the ID, or the value is lower than the existing
    if (typeof(acc[obj['id']]) == 'undefined' || obj['val'] < acc[obj['id']]) {
      acc[obj['id']] = obj;
    }
    return acc;
  }, {}));
}

console.log(minFromArray(input));