我已经浏览了很多帖子,并且已经解决了这个问题太久了。要点是,如果存在重复的对象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}
]
答案 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));