如何使用javascritpt进行透视?

时间:2017-11-06 14:41:05

标签: javascript arrays

我正面对一个对象数组,其中可能有多个具有相同值id的对象。当id的值相同时,price的值也将相同。

以下是一个例子:

[{
    'id': 'A', 'price': 1, 'quantity': 1
}, {
    'id': 'A', 'price': 1, 'quantity': 2
}, {
    'id': 'B', 'price': 1, 'quantity': 1
}]

结果应该是一个数组,其中每个id只显示一个对象。此外,quantity必须使用重复值id中的数量总和填充。

以下是上述示例的预期结果:

[{
    'id': 'A','price': 1, 'quantity': 3
}, {
    'id': 'B','price': 1, 'quantity': 1
}]

实际上,我需要转动。 我想避免jQuery和外部调用。是否可以仅使用JS函数来实现这一点?

3 个答案:

答案 0 :(得分:1)

使用对象的阵列有点乱,但这是可行的。

const list = [
    {'id': 'A', 'price': 1,  'quantity': 1},
    {'id': 'A', 'price': 1,  'quantity': 2},
    {'id': 'B', 'price': 1,  'quantity': 1}
];

// Objects are easier to work with. An intermediate step to combine entries by Id.
const intermediate = list.reduce((a, { id, price, quantity }) => {
  a[id] = a[id] || { id, price, quantity: 0}; // Copy id & price if the entry doesn't exist yet.
  a[id].quantity += quantity;                 // Add quantity.
  return a;
}, {});

// Map it all back to an array of objects.
const result = Object.keys(intermediate).map(id => intermediate[id]);
console.log(result);

这是ES5版本:

var list = [
    {'id': 'A', 'price': 1,  'quantity': 1},
    {'id': 'A', 'price': 1,  'quantity': 2},
    {'id': 'B', 'price': 1,  'quantity': 1}
];

// Objects are easier to work with. An intermediate step to combine entries by Id.
var intermediate = list.reduce(function(a, curr) {
  a[curr.id] = a[curr.id] || { id: curr.id, price: curr.price, quantity: 0}; // Copy id & price if the entry doesn't exist yet.
  a[curr.id].quantity += curr.quantity;                 // Add quantity.
  return a;
}, {});

// Map it all back to an array of objects.
var result = Object.keys(intermediate).map(function(id){
  return intermediate[id];
});
console.log(result);

答案 1 :(得分:0)

可能效率不高,但是有效。

const array = [{
'id': 'A', 'price': 1,  'quantity': 1
},{
'id': 'A', 'price': 1,  'quantity': 2
},{
'id': 'B', 'price': 1,  'quantity': 1
}];

const aggregated = array.reduce(function (p, c) {
  if (!p[c.id]) p[c.id] = {quantity: c.quantity, id: c.id, price: c.price};
  else p[c.id].quantity += c.quantity;
  
  return p;
}, {});

const final = Object.keys(aggregated).map(function(k) { return aggregated[k]; });

console.log(final);

答案 2 :(得分:0)

您可以尝试使用此代码,理解起来非常简单:

var objs = [
    { 'id': 'A', 'price': 1, 'quantity': 1 }, 
    { 'id': 'A', 'price': 1, 'quantity': 2 }, 
    { 'id': 'B', 'price': 1, 'quantity': 1 }
];

const results = objs.reduce(function(acc, current) {
  var obj = acc.find(function(o) {
    return o.id === current.id && o.price === current.price
  });

  if (obj) {
    obj.quantity += current.quantity;
  } else {
    acc.push(current);
  }

  return acc;
}, []);

console.log(results);