我有点拘泥于找到一种简单而优雅的方法来转换类似的数组
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);
不那么优雅,但可能会引发进一步的思考:
使用map
、reduce
和lodash 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)))