由于SQL查询的结果,我有两个JavaScript字符串数组(每个数组是结果中的一列),其中可能包含重复项,例如:
arrOne = ["key_1", "key_1", "key_2", "key_3", "key_1", "key_1"]
arrTwo = ["val_1", "val_1", "val_3", "val_3", "val_2", "val_3"]
并且我需要将它们简化为一个对象:
newObj = {
key_1: ["val_1", "val_2", "val_3"],
key_2: ["val_3"],
key_3: ["val_3"]
}
因此,基本上,对于每个键,值对,该值应该是来自arrTwo的唯一值的简化列表。
我尝试过:
let newObj = arrOne.reduce((o, k, i) => ({...o, [k]: arrTwo[i]}), {})
这给了我
{ key_1: 'val_3', key_2: 'val_3', key_3: 'val_3' }
但是我需要arrTwo [i]部分来简化值列表,而不是每个键的最后一个值。
这可能有一个优雅的单行解决方案,但是我是JavaScript新手,我找不到合适的解决方案(我认为这里不需要循环)。
答案 0 :(得分:4)
您可以使用Set
并收集所有值。
var arrOne = ["key_1", "key_1", "key_2", "key_3", "key_1", "key_1"],
arrTwo = ["val_1", "val_1", "val_3", "val_3", "val_2", "val_3"],
newObj = arrOne.reduce(
(o, k, i) => ({ ...o, [k]: [...new Set([...(o[k] || []), arrTwo[i]])] }),
{}
);
console.log(newObj);
答案 1 :(得分:0)
在第一个数组中的一个上使用reduce并使用索引从第二个数组中访问属性
var arrOne = ["key_1", "key_1", "key_2", "key_3", "key_1", "key_1"]
var arrTwo = ["val_1", "val_1", "val_3", "val_3", "val_2", "val_3"]
let newObj = arrOne.reduce(function(acc, curr, index) {
// check if the object has such key and if it dont contain the corresponding value
if (acc[curr] && acc[curr].indexOf(arrTwo[index]) === -1) {
acc[curr].push(arrTwo[index])
} else {
acc[curr] = [];
acc[curr].push(arrTwo[index])
}
return acc;
}, {});
console.log(newObj)
答案 2 :(得分:0)
const arrOne = ["key_1", "key_1", "key_2", "key_3", "key_1", "key_1"];
const arrTwo = ["val_1", "val_1", "val_3", "val_3", "val_2", "val_3"];
console.log(
arrTwo.reduce((a, c, i) => {
if (a[arrOne[i]].indexOf(c) == -1) a[arrOne[i]].push(c);
return a;
}, arrOne.reduce((a, c) => {
a[c] = []; return a;
}, {})));