我有两个数组

var arrayA = ["a", "a", "b", "b", "a", "c"];
var arrayB = [10, 20, 3, 2, 20, 5];

如您所见,arrayA[0], arrayA[1], arrayA[4]具有相同的元素(arrayA[2], arrayA[3]也相同)。

因此,基于上面的示例,我希望将arrayB[0], arrayB[1], arrayB[4]arrayB[2], arrayB[3]进行汇总。

期望输出
arrayA = ["a", "b", "c"];
arrayB = [50, 5, 5];

如果arrayA具有基于arrayA索引的相同元素,则可以对arrayB元素求和。并且有Lodash / Underscore函数可以做到这一点吗?

最佳答案

您可以使用对象作为索引并维护值。

var arrayA = ["a", "a", "b", "b", "a", "c"],
    arrayB = [10, 20, 3, 2, 20, 5],
    indices = Object.create(null),
    groupedA = [],
    groupedB = [];

arrayA.forEach(function (a, i) {
    if (!(a in indices)) {
        groupedA.push(a);
        indices[a] = groupedB.push(0) - 1;
    }
    groupedB[indices[a]] += arrayB[i];
});

console.log(groupedA);
console.log(groupedB);
.as-console-wrapper { max-height: 100% !important; top: 0; }


改变原始数组的版本。

var arrayA = ["a", "a", "b", "b", "a", "c"],
    arrayB = [10, 20, 3, 2, 20, 5],
    indices = Object.create(null),
    i = 0;

while (i < arrayA.length) {
    if (!(arrayA[i] in indices)) {
        indices[arrayA[i]] = i++;
        continue;
    }
    arrayB[indices[arrayA[i]]] += arrayB.splice(i, 1)[0];
    arrayA.splice(i, 1);
}

console.log(arrayA);
console.log(arrayB);
.as-console-wrapper { max-height: 100% !important; top: 0; }

10-04 15:15