[英]Accessing object used in some() function in javascript
我編寫了此函數來組合重復的對象並添加其數量。
我在增加數量時遇到問題。
function removeDuplicates (input){
var new_array = [];
input.forEach(function(unmerged){
if(new_array.some(item => item.model === unmerged.model)){
item.quantity += unmerged.quantity; ////this throws error
} else {
new_array.push(unmerged);
}
});
return new_array;
};
我假設“ item”僅在some()函數內部創建和使用,並且不再可訪問。 如何修復此功能,以便可以編輯其屬性?
例如:
功能前:
var product_array = [
{model:1, quantity:3},
{model:1, quantity:2},
{model:2, quantity:1}
];
后功能:
var product_array = [
{model:1, quantity:5},
{model:2, quantity:1}
]
沒錯,該項目只能在箭頭功能范圍內訪問。
您可以使用下划線(或破折號).find函數。
例如:
var item = _.find(new_array, {model : unmerged.model});
if (item) {
item.quantity += unmerged.quantity;
}
您也可以使用es6新數組函數
var item = new_array.find(elem => elem.model ===unmerged.model);
您可以指定項目的變量是在范圍和使用:
input.forEach(function(unmerged){
var current;
if(new_array.some(item => {current = item; return item.model === unmerged.model})){
current.quantity += unmerged.quantity; ////this throws error
} else {
new_array.push(unmerged);
}
});
對於ES5,這不是最優雅的解決方案,但是您可以這樣做:
function comparator(obj1, obj2) {
if (obj1.model < obj2.model) return -1;
if (obj1.model > obj2.model) return 1;
return 0;
}
function combineDuplicates(arr, comparator) {
arr.sort(comparator);
for (var i = 0; i < arr.length - 1; i++) {
while (arr[i + 1] !== undefined && arr[i].model === arr[i + 1].model) {
arr[i].quantity += arr[i + 1].quantity;
arr.splice(i + 1, 1);
}
}
return arr;
}
基本上,您對數組進行排序,然后遍歷整個數組。 還有第二個循環,該循環不斷添加重復項的數量並隨后刪除重復項。 效率不是很高,但是可以。
范例 :
var product_array = [
{model:1, quantity:3},
{model:1, quantity:2},
{model:2, quantity:1},
{model:1, quantity:10},
{model:1, quantity:10},
{model:1, quantity:10},
{model:2, quantity:5}
];
var new_product_array = combineDuplicates(product_array, comparator);
console.log(new_product_array); // [ { model: 1, quantity: 35 }, { model: 2, quantity: 6 } ]
您可以使用this
在forEach
循環作為臨時對象進行合並。
function removeDuplicates(input) { var new_array = []; input.forEach(function (unmerged) { if (!this[unmerged.model]) { this[unmerged.model] = unmerged; new_array.push(unmerged); return; } this[unmerged.model].quantity += unmerged.quantity; }, {}); return new_array; }; var product_array = [{ model: 1, quantity: 3 }, { model: 1, quantity: 2 }, { model: 2, quantity: 1 }], result = removeDuplicates(product_array); document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.