首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Javascript将对象数组转换为对象

使用Javascript将对象数组转换为对象
EN

Stack Overflow用户
提问于 2018-06-30 20:10:14
回答 3查看 52关注 0票数 0

我有以下输入

const testObj = [
    {id:1, name: 'name1',role:'Developer'},
    {id:2, name: 'name2',role:'Lead'},
    {id:3, name: 'name3',role:'QA'}
]

并且我需要获得以下格式的输出

{
    Developer: {id:1,name:'name1',role:'Developer'},
    Lead: {id:2,name:'name2',role:'Lead'},
    QA: {id:3,name:'name3',role:'QA'}
}

我试着写了下面的代码,但是没有得到我想要的输出

const convert = (array,role) => {
    var result = {}
    for(let index = 0; index < array.length; index++){
        result[array[index].id] = array[index].name;
    }
    return result;
}

我使用下面的代码调用我的方法

convert(testObj,'role'); 

如何修改此方法以在不使用Reduce关键字和all的情况下获得所需的输出

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-30 20:14:15

您离得不远(如果我假设输出中的role应该类似于输入中的role),但是for的主体应该是

result[array[index].role] = array[index];

您使用的是id而不是role,并且获取的是name而不是整个对象。

还请注意,您不需要在所显示的代码中使用第二个参数(role),也不需要从原始结构转到新结构:

const testObj = [{id:1, name: 'name1',role:'Developer'},
{id:2, name: 'name2',role:'Lead'},
{id:3, name: 'name3',role:'QA'}]

const convert = (array) => {
  var result = {}
  for (let index = 0; index < array.length; index++) {
    result[array[index].role] = array[index];
  }
  return result
}

console.log(convert(testObj));
.as-console-wrapper {
  max-height: 100% !important;
}

不过,我们可以使用for-of将其简化一点:

const testObj = [{id:1, name: 'name1',role:'Developer'},
{id:2, name: 'name2',role:'Lead'},
{id:3, name: 'name3',role:'QA'}];

const convert = (array) => {
  const result = {};
  for (const entry of array) {
    result[entry.role] = entry;
  }
  return result;
}

console.log(convert(testObj));
.as-console-wrapper {
  max-height: 100% !important;
}

请注意,as Jonas W. points out,您的结果结构仅允许每个角色中只有一个人。您可能希望改为使用对象存储数组:

const testObj = [{id:1, name: 'name1',role:'Developer'},
{id:2, name: 'name2',role:'Lead'},
{id:3, name: 'name3',role:'QA'},
{id:4, name: 'name4',role:'QA'}]

const convert = (array) => {
  var result = {}
  for (let index = 0; index < array.length; index++) {
    var roleArray = result[array[index].role];
    if (!roleArray) {
      roleArray = result[array[index].role] = [];
    }
    roleArray.push(array[index]);
  }
  return result
}

console.log(convert(testObj));
.as-console-wrapper {
  max-height: 100% !important;
}

或者,再次使用for-of

const testObj = [{id:1, name: 'name1',role:'Developer'},
{id:2, name: 'name2',role:'Lead'},
{id:3, name: 'name3',role:'QA'},
{id:4, name: 'name4',role:'QA'}];

const convert = (array) => {
  const result = {}
  for (const entry of array) {
    let roleArray = result[entry.role];
    if (!roleArray) {
      roleArray = result[entry.role] = [];
    }
    roleArray.push(entry);
  }
  return result;
}

console.log(convert(testObj));
.as-console-wrapper {
  max-height: 100% !important;
}

票数 1
EN

Stack Overflow用户

发布于 2018-06-30 20:15:08

您的代码通过.id.name进行分组,您希望根据对象的角色对对象本身进行分组:

function group(array, key) {
  const result = {};
  for(const obj of array)
    result[ obj[key] ] = obj;
  return result;
}

group(testObj, "role")
票数 1
EN

Stack Overflow用户

发布于 2018-06-30 20:23:09

const testObj = [{id:1, name: 'name1',role:'Developer'},
{id:2, name: 'name2',role:'Lead'},
{id:3, name: 'name3',role:'QA'}];

const convert = (array, role) => {
	let i = 0;
  const output = {};
	for (; i < array.length; i+= 1) {
  	output[array[i][role]] = array[i];
  }
  return output;
}

console.log(convert(testObj, 'role'));

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51114795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档