从两个数组创建JavaScript对象

37 javascript

我有两个数组:newParamArr[i]paramVal[i].

newParamArr[i]数组中的示例值: ["Name", "Age", "Email"]

paramVal[i]数组中的示例值: ["Jon", "15", "jon@gmail.com"]

我需要创建一个JavaScript对象,将数组中的所有项放在同一个对象中.例如

{newParamArr[0]:paramVal[0], newParamArr[1]:paramVal[1], ...}

两个数组的长度始终相同,但数组的长度可以增加或减少.如...

newParamArr.length === paramVal.length 将永远返回true.

以下帖子都没有帮助回答我的问题:

用于创建JSON对象的Javascript递归

递归循环遍历对象以构建属性列表

geo*_*org 64

你是说这个吗?

var keys = ['foo', 'bar', 'baz'];
var values = [11, 22, 33]

var result = {};
keys.forEach((key, i) => result[key] = values[i]);
console.log(result);
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用 Object.assign

result = Object.assign(...keys.map((k, i) => ({[k]: values[i]})))
Run Code Online (Sandbox Code Playgroud)

或对象扩展语法(ES2018):

result = keys.reduce((o, k, i) => ({...o, [k]: values[i]}), {})
Run Code Online (Sandbox Code Playgroud)

如果你正在使用lodash,那么这个类型的东西就是_.zipObject.

  • “ES2018”示例只是一个**奇特的反模式!** 在每 N 次迭代中在内部传播对象的成本太高 - 当只需要一个简单的分配就足够了。 (3认同)
  • 可能是有史以来最简短的答案。像魅力一样工作! (2认同)

cra*_*tin 8

使用 ECMAScript2015:

const obj = newParamArr.reduce((obj, value, index) => {
    obj[value] = paramArr[index];
    return obj;
}, {});
Run Code Online (Sandbox Code Playgroud)

(编辑)以前误解了 OP 想要一个数组:

const arr = newParamArr.map((value, index) => ({[value]: paramArr[index]}))
Run Code Online (Sandbox Code Playgroud)


Spa*_*mes 5

我知道这个问题已经有一年了,但这里有一个单行解决方案:

Object.assign( ...newParamArr.map( (v, i) => ( {[v]: paramVal[i]} ) ) );
Run Code Online (Sandbox Code Playgroud)


tec*_*oke 5

我在几个地方需要这个所以我做了这个功能......

function zip(arr1,arr2,out={}){
    arr1.map( (val,idx)=>{ out[val] = arr2[idx]; } );
    return out;
}


console.log( zip( ["a","b","c"], [1,2,3] ) );

> {'a': 1, 'b': 2, 'c': 3} 
Run Code Online (Sandbox Code Playgroud)