从一组键和一组值创建一个对象

IT技术 javascript javascript-objects
2021-02-04 14:28:19

我有两个数组:newParamArrparamVal

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

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

我需要创建一个 JavaScript 对象,将数组中的所有项目放在同一个对象中。例如{ [newParamArr[0]]: paramVal[0], [newParamArr[1]]: paramVal[1], ... }

在这种情况下,结果应该是{ Name: "Jon", "Age": 15, "Email": "jon@gmail.com" }

两个数组的长度始终相同,但数组的长度可以增加或减少。这意味着newParamArr.length === paramVal.length将永远持有。

以下帖子均无法帮助回答我的问题:

用于创建 JSON 对象的 Javascript 递归

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

6个回答

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

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

或者,您可以使用 Object.assign

result = Object.assign(...keys.map((k, i) => ({[k]: values[i]})))

或对象传播语法(ES2018):

result = keys.reduce((o, k, i) => ({...o, [k]: values[i]}), {})

Object.fromEntries(ES2019):

Object.fromEntries(keys.map((_, i) => [keys[i], values[i]]))

如果您正在使用 lodash,那么_.zipObject正是针对这种类型的。

目前,如果您在键不唯一的两个数组上使用此方法(即 'foo' 在键数组中多次出现),您最终会得到一个减少的对象,其中每个键的值只是最后一个匹配的值。并且之前的值丢失了。(这非常令人沮丧!)如何修改这种方法,以便将值累积到每个键的所有匹配值的数组中,或者可能是所有匹配值的总和?我想使用 lodash 中的 _.groupBy 来创建这些组,但这似乎只是按值分组,而不是按键分组。
2021-03-14 14:28:19
“ES2018”示例只是一个奇特的反模式!在内部传播对象,每 N 次迭代都太昂贵了 - 当只需要一个简单的分配时。
2021-03-20 14:28:19
是的,这就是我想要的结果,让我测试一下!
2021-03-22 14:28:19
可能是有史以来简短而简单的答案。像魅力一样工作!
2021-03-23 14:28:19

使用 ECMAScript2015:

const obj = newParamArr.reduce((obj, value, index) => {
    obj[value] = paramArr[index];
    return obj;
}, {});

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

const arr = newParamArr.map((value, index) => ({[value]: paramArr[index]}))
@craigmichaelmartin 虽然您的原始答案不满足 OP 的要求,但这正是我正在寻找的。IE。映射来自两个数组的值并将它们动态组合到单个对象中。谢谢!
2021-03-26 14:28:19
这将返回一个单键对象数组;它不会将所有内容合并为一个对象。你会想要的reduce
2021-04-12 14:28:19

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

Object.assign( ...newParamArr.map( (v, i) => ( {[v]: paramVal[i]} ) ) );

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

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} 

以下对我有用。

//test arrays
var newParamArr = [1, 2, 3, 4, 5];
var paramVal = ["one", "two", "three", "four", "five"];

//create an empty object to ensure it's the right type.
var obj = {};

//loop through the arrays using the first one's length since they're the same length
for(var i = 0; i < newParamArr.length; i++)
{
    //set the keys and values
    //avoid dot notation for the key in this case
    //use square brackets to set the key to the value of the array element
    obj[newParamArr[i]] = paramVal[i];
}

console.log(obj);
我现在也做了同样的事情,这是查看循环元素到底发生了什么的最佳方式。
2021-04-08 14:28:19