JavaScript删除对象数组中的重复对象&对属性求和
JavaScript to remove duplicate objects in an Object Array & sum the properties
我已经尝试了几天,现在想出一个解决我的问题,我只是不能,想象我有以下JSON数组(我们将其称为jsonData
:
[
{ "id": 118748, "price":"", "stocklevel": 100, "instock": false, "pname": "Apple TV" },
{ "id": 118805291, "price":"", "stocklevel": 432, "instock": true, "pname": "Hitachi TV"},
{ "id": 118801891, "price":"", "stocklevel": 0, "instock": false, "pname": "Sony TV" },
{ "id": 118748, "price":"", "stocklevel": 2345, "instock": true, "pname": "Apple TV"},
...
现在我的JSON数组中可能有超过100个项目,我想删除具有重复id的项目,但要求和库存水平并保留数组中的顺序,因此一行应该取代该id最近出现的位置。在上面的JSON中,具有"id":118748的对象的第一个实例被删除,但它的库存水平值传递/添加了具有相同id的对象的下一个实例,因此JSON数组看起来像这样:
[
{ "id": 118805291, "price":"", "stocklevel": 432, "instock": true, "pname": "Hitachi TV"},
{ "id": 118801891, "price":"", "stocklevel": 0, "instock": false, "pname": "Sony TV" },
{ "id": 118748, "price":"", "stocklevel": 2445, "instock": true, "pname": "Apple TV"},
...
我生成了以下代码来删除重复项,但我无法对库存水平总数求和,下面是我的代码:
function idsAreEqual(obj1, obj2) {
return obj1.id === obj2.id;
}
function arrayContains(arr, val, equals) {
var i = arr.length;
while (i--) {
if (equals(arr[i], val)) {
return true;
}
}
return false;
}
function removeDups(arr, equals) {
var originalArr = arr.slice(0);
var i, k, len, val;
arr.length = 0;
for (i = originalArr.length - 1, len = originalArr.length, k = originalArr.length - 1 ; i > 0; --i) {
val = originalArr[i];
if (!arrayContains(arr, val, equals)) {
arr.push(val);
}
}
}
removeDups(jsonData, idsAreEqual);
jsonData.reverse();
有人能帮我解决这个问题吗?请注意,我不能使用下划线,jQuery或任何其他库。
提前致谢
您可以做如下操作,我认为这比您的实现要简单一些。我也使用forEach
和reduce
,这是ES5,但应该在现代浏览器上工作。如果你使用的是旧的、非es5兼容的浏览器,你可以抓取一个polyfil:
var data = [
{ "id": 118748, "price":"", "stocklevel": 0, "instock": false, "pname": "Apple TV" },
{ "id": 118805291, "price":"", "stocklevel": 432, "instock": true, "pname": "Hitachi TV"},
{ "id": 118801891, "price":"", "stocklevel": 0, "instock": false, "pname": "Sony TV" },
{ "id": 118748, "price":"", "stocklevel": 2345, "instock": true, "pname": "Apple TV"}
];
function dedup_and_sum(arr, prop) {
var seen = {},
order = [];
arr.forEach(function(o) {
var id = o[prop];
if (id in seen) {
// keep running sum of stocklevel
var stocklevel = seen[id].stocklevel + o.stocklevel
// keep this newest record's values
seen[id] = o;
// upid[118805291], stocklevel=432, instock=truedate stocklevel to our running total
seen[id].stocklevel = stocklevel;
// keep track of ordering, having seen again, push to end
order.push(order.splice(order.indexOf(id), 1));
}
else {
seen[id] = o;
order.push(id);
}
});
return order.map(function(k) { return seen[k]; });
}
// Get unique records, keeping last record of dups
// and summing stocklevel as we go
var unique = dedup_and_sum(data, 'id');
unique.forEach(function(o) {
console.log("id[%d], stocklevel=%d, instock=%s", o.id, o.stocklevel, o.instock);
});
// output =>
// id[118805291], stocklevel=432, instock=true
// id[118801891], stocklevel=0, instock=false
// id[118748], stocklevel=2445, instock=true
EDIT已更新以符合我们在注释中讨论的要求。
相关文章:
- 如何从对象的原型方法访问JavaScript对象属性
- 如何将数组项添加到对象属性中
- 设置嵌套对象属性的更好方法
- JavaScript管理具有重复属性名称的对象属性
- 如何使用element.myobj.prop等具有对象属性的元素
- 如何使用(this)访问Angular 2 http rxjs catch函数中的对象属性
- Es6:能够在设置/更新/删除对象属性时调用自定义方法
- 如何在AngularJS工厂中正确声明对象属性
- 如何使用object.assign()从其他对象引用基本对象属性
- 使用XPath样式访问Javascript JSON对象属性
- 将javascript对象(属性+值)合并到一个对象中
- 数组:使对象属性成为数组键
- 无法从JavaScript中的函数调用对象属性
- Google Closure Advanced |无法识别对象属性|动态属性
- Javascript从匿名函数访问外部对象属性
- 从函数更改对象属性
- 如何从字符串变量访问对象属性
- 从嵌套对象属性中获取排除某个值的最高值
- 在Aurelia computeds中,当设置依赖关系时,如何声明对对象属性的依赖关系
- 传递数量不确定的可能嵌套的对象属性