簡體   English   中英

訪問javascript中some()函數中使用的對象

[英]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 } ]

您可以使用thisforEach循環作為臨時對象進行合並。

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM