Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有一种方法可以将reduce应用于两个数组,但不重置调用之间的累加器?_Javascript_Arrays_Performance - Fatal编程技术网

Javascript 有没有一种方法可以将reduce应用于两个数组,但不重置调用之间的累加器?

Javascript 有没有一种方法可以将reduce应用于两个数组,但不重置调用之间的累加器?,javascript,arrays,performance,Javascript,Arrays,Performance,因此,如果我有一个对象数组: var synched = [{ name = "something", value = 11132 }, { name = "something else", value = 1231233 }...] 另一个数组几乎相同,但包含一些其他值: var opened = [{ name = "something", value = 1233312 }, { name = "something else", value

因此,如果我有一个对象数组:

var synched = [{
   name = "something",
   value = 11132
}, {
   name = "something else",
   value = 1231233
}...]
另一个数组几乎相同,但包含一些其他值:

var opened = [{
   name = "something",
   value = 1233312
}, {
   name = "something else",
   value = 12312333
}, {
   name = "something",
   value = 1241233
}]

我想把它们全部合并到一个对象数组中,在这个数组中我计算每个数组中“name”的准确度

var result = [{
    name: "something",
    opened: 2,
    synched: 1,
    total: 3
}, {
    name: "something else",
    opened: 1,
    synched: 1,
    total: 2
}]
有没有比多个
array.reduce
调用更有效的方法

var data = synched.reduce(function (data, item) {
    var key = item.name
    var created = (data[key] || (data[key] = {'name': key, 'opened': 0, 'synched': 0, 'total': 0}));
    created['synched'] += 1;
    created['total'] += 1;

    return data;
}, {});

var data1 = opened.reduce(function (data1, item) {
    var key = item.name
    var created = (data1[key] || (data1[key] = {'name': key, 'opened': 0, 'synched': 0, 'total': 0}));
    created['opened'] += 1;
    created['total'] += 1;

    return data1;
}, {});

Object.keys(data).forEach(function (key) {
    if(data1.hasOwnProperty(key)){
        data1[key]['synched'] = data[key]['synched'];
        data1[key]['total'] = data[key]['total'] + data1[key]['total'];
    } else {
        data1[key] = data[key];
    }
});

var result = Object.keys(data1).map(function(item) { return data1[item]; });
编辑:

以下@Pointy建议我可以做到这一点:

var data1 = opened.reduce(function (data, item) {
        var key = item.name
        var created = (data[key] || (data[key] = {'name': key, 'opened': 0, 'synched': 0, 'total': 0}));
        created['opened'] += 1;
        created['total'] += 1;

        return data;
    }, data);

这将允许我摆脱第三次迭代。谢谢

只需将
数据
作为累加器参数传递给第二个
.reduce()
?啊!知道了!这是初始值。我需要将
数据
作为累加器传入,但也要作为初始值,而不是
{}
。这就是为什么它只是重置我的数据输出。我现在明白了。谢谢