通过JavaScript

时间:2016-08-23 19:37:52

标签: javascript arrays sorting lodash data-manipulation

我有一个对象数组。这些对象具有名为" type"。

的属性
[{
    "id": "1",
    "type": "Plane",
    "date": "date",
    "value": "10",
    "another_value": "10"
},
{
    "id": "1",
    "type": "Plane",
    "date": "date",
    "value": "15",
    "another_value": "10"
},
{
    "id": "1",
    "type": "Car",
    "date": "date",
    "value": "25",
    "another_value": "10"
},
{
    "id": "1",
    "type": "Car",
    "date": "date",
    "value": "25",
    "another_value": "10"
}]

现在,我有一张桌子,我想要显示它。我希望将它显示为两行,一行,用于" Plane"一个用于" Car"在那一行中我想要的是(value和another_value)

的总和

所以我认为通过以某种方式浏览我原始的对象数组并按"类型"对它进行分组,这是最容易实现的。因此,我将获得一个包含#34; Car"类型的所有对象的数组,以及一个带有" Plane"的对象数组。

我有lodash可用,然后我还需要找到一种方法来求和这些值,所以我可以在我的表中,在每行的列中显示它。

关于如何实现这一目标的任何建议?

3 个答案:

答案 0 :(得分:1)

您可以使用普通JavaScript,使用map()filter()等方法执行此操作:

const arr = [{
    "id": "1",
    "type": "Plane",
    "date": "date",
    "value": "10",
    "another_value": "10"
},
{
    "id": "1",
    "type": "Plane",
    "date": "date",
    "value": "15",
    "another_value": "10"
},
{
    "id": "1",
    "type": "Car",
    "date": "date",
    "value": "25",
    "another_value": "10"
},
{
    "id": "1",
    "type": "Car",
    "date": "date",
    "value": "25",
    "another_value": "10"
}]

const sum = (a, b) => Number(a) + Number(b)

const cars = arr.filter(x => x.type === 'Car')
const planes = arr.filter(x => x.type === 'Plane')

const carsValue = cars.map(x => x.value).reduce(sum)
const planesValue = planes.map(x => x.value).reduce(sum)

const carsAnotherValue = cars.map(x => x.another_value).reduce(sum)
const planesAnotherValue = planes.map(x => x.another_value).reduce(sum)

答案 1 :(得分:0)

您可以先按type对所有对象进行分组,然后减少所有valueanother_value

var types = _.groupBy(array, 'type');
var result = _.mapValues(types, function(value, key) {
  return _.reduce(value, function(memo, v) { 
    return memo + +v.value + +v.another_value;
  }, 0);
});



var array = [{
    "id": "1",
    "type": "Plane",
    "date": "date",
    "value": "10",
    "another_value": "10"
},
{
    "id": "1",
    "type": "Plane",
    "date": "date",
    "value": "15",
    "another_value": "10"
},
{
    "id": "1",
    "type": "Car",
    "date": "date",
    "value": "25",
    "another_value": "10"
},
{
    "id": "1",
    "type": "Car",
    "date": "date",
    "value": "25",
    "another_value": "10"
}];

var types = _.groupBy(array, 'type');
var result = _.mapValues(types, function(value, key) {
  return _.reduce(value, function(memo, v) { 
    return memo + +v.value + +v.another_value;
  }, 0);
});

console.log(result);

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
&#13;
&#13;
&#13;

答案 2 :(得分:-1)

另一种方法

var count = _.countBy(data, 'type');
var sum = _.reduce(data, function(total, obj) {
    total[obj.type] += Number(obj.value);
    return total;
}, {
    Car: 0,
    Plane: 0
});

var data = [{
    "id": "1",
    "type": "Plane",
    "date": "date",
    "value": "10",
    "another_value": "10"
},
{
    "id": "1",
    "type": "Plane",
    "date": "date",
    "value": "15",
    "another_value": "10"
},
{
    "id": "1",
    "type": "Car",
    "date": "date",
    "value": "25",
    "another_value": "10"
},
{
    "id": "1",
    "type": "Car",
    "date": "date",
    "value": "25",
    "another_value": "10"
}];

var count = _.countBy(data, 'type');
var sum = _.reduce(data, function(total, obj) {
  total[obj.type] += Number(obj.value);
  return total;
}, {
  Car: 0,
  Plane: 0
});

console.log(count['Plane']);
console.log(count['Car']);
console.log(sum['Plane']);
console.log(sum['Car']);
<script src="https://cdn.jsdelivr.net/lodash/4.15.0/lodash.min.js"></script>