[key1,value1,key2,value2,..]到对象的链



我有点拘泥于找到一种简单而优雅的方法来转换类似的数组

const array = ["k1", "v1", "k2", "v2"]

到对象

const obj = {"k1": "v1", "k2": "v2"}

只是在寻找灵感

也许是好的旧for-loop

回顾提出的解决方案

for循环(干净可读(

const obj = {}
for (let i = 0; i < array.length; i += 2) {
obj[array[i]] = array[i + 1]
}

Array.reduce(oneliner,但有点神秘(

const obj = array.reduce((acc, curval, idx, arr) => (idx % 2) == 0 ? 
(acc[curval] = arr[idx+1], acc) : acc, {});

_.cchunk+Object.from条目

我最喜欢这个解决方案,但它有lodash作为依赖项。如果ES能在array.chunk(2)上实现它,那就太酷了

Object.fromEntries(_.chunk(array))

真正称为一行有点长,但如果你能找到一种很好的方法将数组分块成对,那么你就可以把它交给Object.fromEntries。像lodash的_.chunk这样的东西会让它看起来更好,但除此之外:

const array = ["k1", "v1", "k2", "v2"]
const obj = Object.fromEntries(Array.from({length: array.length / 2}, (_, i) => array.slice(i, i+2)))
console.log(obj);

使用Array.reduce((:

const array = ["k1", "v1", "k2", "v2"];
var newarr = array.reduce((acc, curval, idx, arr) => (idx % 2) == 0 ? 
(acc[curval] = arr[idx+1], acc) : acc, {});
console.log(newarr);

您可以使用以下代码实现这一点:

const array = ["k1", "v1", "k2", "v2"];
let obj = {};
for (let i = 0; i < array.length; i+=2) {
obj[array[i]] = array[i+1];
}
console.log("Array: "+array);
console.log("nObject: "+array);
console.log("    k1: "+obj["k1"]);
console.log("    k2: "+obj.k2);

不那么优雅,但可能会引发进一步的思考:

使用mapreducelodash merging:

let array = ["a1", "b1", "a2", "b2"];
array = array.map((e,i)=>{
let newobj={};
newobj[e]=array[i+1];
return i%2===0?newobj:{}
});
array.reduce((v1,v2)=>_.merge(v1, v2));

(假设array中有偶数个元素(

使用类似chunk的函数,但使用纯Js:

const array = ["k1", "v1", "k2", "v2"]
function chunks(arr, size = 2) {
return arr.map((x, i) => i % size == 0 && arr.slice(i, i + size)).filter(x => x)
}
console.log(Object.fromEntries(chunks(array)))

这个是使用flatMap():

const array2 = ["k1", "v1", "k2", "v2"]
const pairs = (arr)=>{return arr.flatMap((_, i, a) => i % 2 ? [] : [a.slice(i, i + 2)])}
console.log(Object.fromEntries(pairs(array2)))

最新更新