簡體   English   中英

javascript:操作對象數組

[英]javascript: manipulate array of objects

我有一個像這樣的數組:

arr = [
  {name:'Tom', a:1, b:1, c:0},
  {name:'Sam', a:0, b:1, c:1},
  {name:'Tom', a:0, b:0, c:1},
  {name:'Sam', a:1, b:2, c:1},
  {name: 'Jack', a:1, b:2, c:0}
]

並且我需要對具有相同名稱的對象的屬性求和,然后對重復項進行切片:

arr = [
  {name:'Tom', a:1, b:1, c:1},
  {name:'Sam', a:1, b:3, c:2},
  {name: 'Jack', a:1, b:2, c:0}
]

純JavaScript怎么可能?

for loopArray#splice ,以供索引參考。

// object reference for index
var obj = {},
  //  variable for delete count
  dc = 0,
  // variable for length of array
  len = arr.length;

// iterate over the object array
for (var i = 0; i < len; i++) {
  // get the current object
  var v = arr[i - dc];
  // check property defined in reference object
  if (obj.hasOwnProperty(v.name)) {
    // if already defined add the values
    arr[obj[v.name]].a += v.a;
    arr[obj[v.name]].b += v.b;
    arr[obj[v.name]].c += v.c;
    // if there is random properties are there then use 
    // Object.keys to get the property name value array
    // and iterate and update the properties ( except `name` )

    // remove the current element and increment delete count
    arr.splice(i - dc++, 1);
  } else {
    // else define the index reference in object
    obj[v.name] = i - dc;
  }
}

 var arr = [{ name: 'Tom', a: 1, b: 1, c: 0 }, { name: 'Sam', a: 0, b: 1, c: 1 }, { name: 'Tom', a: 0, b: 0, c: 1 }, { name: 'Sam', a: 1, b: 2, c: 1 }, { name: 'Jack', a: 1, b: 2, c: 0 }]; var obj = {}, dc = 0, len = arr.length; for (var i = 0; i < len; i++) { var v = arr[i - dc]; if (obj.hasOwnProperty(v.name)) { arr[obj[v.name]].a += va; arr[obj[v.name]].b += vb; arr[obj[v.name]].c += vc; arr.splice(i - dc++, 1); } else { obj[v.name] = i - dc; } } console.log(arr); 

關於隨機屬性的建議,帶有哈希表。

 var arr = [{ name: 'Tom', a: 1, b: 1, c: 0 }, { name: 'Sam', a: 0, b: 1, c: 1 }, { name: 'Tom', a: 0, b: 0, c: 1 }, { name: 'Sam', a: 1, b: 2, c: 1 }, { name: 'Jack', a: 1, b: 2, c: 0 }], grouped = []; arr.forEach(function (a) { if (!this[a.name]) { this[a.name] = { name: a.name }; grouped.push(this[a.name]); } Object.keys(a).forEach(function (k) { if (k !== 'name') { this[k] = (this[k] || 0) + a[k]; } }, this[a.name]); }, Object.create(null)); console.log(grouped); 

創建第二個數組。 然后,對於第一個數組的每個元素,迭代第一個數組並將屬性之和推入新數組。 在每個重復項上,您都必須從第一個數組中刪除該條目。 還有田田

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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