1

我正在尝试从对象数组创建单个 JavaScript 对象。

对象中的某些值保持不变,而需要将数值或浮点值相加以形成新的单个对象。

如何做到这一点?

[{
    'visit_date': '2013-02-02',
    'house_number': '22',
    'price': 12.98,
    'count_value': 21.554,
    'variance': -23.434343434
},
{
    'visit_date': '2013-02-02',
    'house_number': '22',
    'price': 34.78,
    'count_value': 1.34,
    'variance': -23.434343434
},
{
    'visit_date': '2013-02-02',
    'house_number': '22',
    'price': 61.41,
    'count_value':1.94,
    'variance': -12.977677874
}]
4

3 回答 3

2

for-in遍历数组,对每个对象使用循环,对于 where 的条目typeof value === "number",将它们相加。当它们不是数字时,大概会做一些有用的事情,但你还没有说什么。:-)

抱歉,错过了 jQuery 标签。使用 jQuery 可以更短each

var dest = {};

$.each(source, function(index, entry) {
    $.each(entry, function(key, value) {
        if (typeof value === "number") {
            dest[key] = key in dest ? dest[key] + value : value;
        }
        else {
            // do something useful with non-numbers
        }
     });
});

each如果你给它一个数组,它将遍历数组元素,或者如果你给它一个非数组对象,它将遍历对象的属性。所以在上面,外部each循环通过你的数组,内部each循环通过每个对象的属性。

此行的in操作员:

dest[key] = key in dest ? dest[key] + value : value;

...告诉我们是否dest已经有一个具有该名称的键:如果有,我们值添加到它。如果没有,我们使用该值为该键创建一个新属性。


原始非jQuery:

大致

var dest = {};
var entry;
var index;
var key;
var value;

for (index = 0; index < source.length; ++index) {
    entry = source[index];
    for (key in entry) {
        value = entry[key];
        if (typeof value === "number") {
            dest[key] = key in dest ? dest[key] + value : value;
        }
        else {
            // do something useful with non-numbers
        }
    }
}
于 2013-08-01T16:15:41.573 回答
2

你可以使用reduce函数来实现它

var result = a.reduce(function (acc, c) {
    acc.visit_date = c.visit_date;
    acc.house_number = c.house_number;
    acc.price += c.price;
    acc.count_value += c.count_value;
    acc.variance += c.variance;
    return acc;
}, {
    'visit_date': '',
    'house_number': '',
    'price': 0,
    'count_value': 0,
    'variance': 0
});

结果将是

{
    visit_date: "2013-02-02",
    house_number: "22",
    price: 109.17,
    count_value: 24.834,
    variance: -59.846364742
}
于 2013-08-01T16:24:53.243 回答
0

大概是这样的?http://jsfiddle.net/tQLy5/1/

function aToObject(a) {
    var o = {}, l = a.length;
    while (l--) {
        for (key in a[l]) {
            if (o.hasOwnProperty(key) && typeof (o[key]) === 'number') {
                o[key] += a[l][key];   
            } else {
                 o[key] = a[l][key];   
            }
        }
    }
    return o;
}

只需遍历整个数组,然后遍历数组中对象的属性。如果属性是数字,则将它们添加在一起,否则只需将属性分配给新对象。

于 2013-08-01T16:25:42.057 回答