javascript - javascript - 根据给定的键将对象数组转换为对象

  显示原文与译文双语对照的内容

我是JavaScript新手。

我需要编写一个函数来将对象的array 隐藏到具有给定键的对象中。

输入就像这样


convert([{id: 1, value: 'abc'}, {id: 2, value: 'xyz'}], 'id')



而输出需要像这样


{


 '1': {id: 1, value: 'abc'},


 '2': {id: 2, value: 'xyz'}


}



我已经尝试了 below 代码。

当我在控制台中直接尝试它的时候,它似乎。


var arr = [{ id: 1, name: 'John', role: 'Developer'},


 { id: 2, name: 'Jane', role: 'Lead'},


 { id: 3, name: 'Robbie', role: 'QA'}];



let res = arr.reduce((prev, current) => {


 prev[current.v] = current;


 return prev;


}, {})



console.log(res)

但是,当我尝试从函数中执行它时,它不工作。


function f(k, v) {


//console.log(k); 


 k.reduce((prev, current) => {


 prev[current.v] = current;


 return prev;


 console.log(prev)


 }, {})


}



f(arr, 'role');



任何帮助都将非常感激。

时间:

很简单为什么要通过减少和 等等 来复杂化


function convert(arr, key) {


 output = {};


 arr.forEach(function(item) {


 output[item[key]] = item;


 })


 console.log(output)


 return output


}



convert([{id: 1, value: 'abc'}, {id: 2, value: 'xyz'}], 'id')

https://jsfiddle.net/cvydtL7p/

你很接近,但是你需要嵌套的括号符号来获得正确的键名,例如

 
prev[current[v]]



 

或者


a[item[keyName]]//as in code below




const convert = (arr, keyName) => arr.reduce((a, item) => {


 a[item[keyName]] = item;


 return a;


}, {});



console.log(


 convert([{id: 1, value: 'abc'}, {id: 2, value: 'xyz'}], 'id')


);

你可以通过映射赋值新对象来获取dunctional方法。


function convert(array, key) {


 return Object.assign(...array.map(o => ({ [o[key]]: o })));


}



console.log(convert([{ id: 1, value: 'abc' }, { id: 2, value: 'xyz' }], 'id'))

这里解决方案适用于我:


function convert(obj, key) {


 var newObj = {};


 obj.forEach(element => {


 newObj[element[key]] = element;


 });


 return newObj;


}



var newObj = convert([{id: 1, value: 'abc'}, {id: 2, value: 'xyz'}], 'id');



console.log(newObj);



你的代码非常工作,唯一的错误是使用括号表示法访问变量键;例如:

如果 vidobj[v] 将评估为 obj.id

另一个错误是,你只是从函数中缺少 return,从而导致 undefined 结果


var arr = [{ id: 1, name: 'John', role: 'Developer'},


 { id: 2, name: 'Jane', role: 'Lead'},


 { id: 3, name: 'Robbie', role: 'QA'}];



function f(k, v) {


//console.log(k); 


 return k.reduce((prev, current) => {


 prev[current[v]] = current;


 return prev;


 }, {})


}



console.log(f(arr, 'role'));

还要注意,return 后面没有任何内容,因这里减速器中的console.log 行应该在这里之前,否则忽略它。

你还需要在 v 中使用 [] 表示法:


var arr = [{


 id: 1,


 name: 'John',


 role: 'Developer'


 },


 {


 id: 2,


 name: 'Jane',


 role: 'Lead'


 },


 {


 id: 3,


 name: 'Robbie',


 role: 'QA'


 }


];



function f(k, v) {


//console.log(k); 


 k.reduce((prev, current) => {


 prev[current[v]] = current;


 return prev;


 }, {})


}



f(arr, 'role');
.as-console-wrapper { max-height: 100%!important; top: auto; }
...