将对象数组转换为单个对象

时间:2018-06-04 06:09:44

标签: javascript arrays object

这是我的初始数组:

[ 
   { 
    id: 1,
    name: 'pos',
    code: 'pos123',
    appCode: 22,
   },
  { 
    id: 2,
    name: 'tailor',
    code: 'tailor123',
    appCode: 21,
  } 
]

我想要的输出:

{
   pos123: {
    id: 1,
    name: 'pos',
    code: 'pos123',
    appCode: 22,
  },
  tailor123: {
    id: 2,
    name: 'tailor',
    code: 'tailor123',
    appCode: 21,
  },
}

我尝试使用map执行此操作,但我无法弄明白。我应该在这里使用reduce吗?

6 个答案:

答案 0 :(得分:3)

您的输出不是数组 - 它是一个对象,因此您必须使用reduce。您只能使用map将数组中的X个项目转换为另一个数组中的X个项目。

const input=[{id:1,name:'pos',code:'pos123',appCode:22,},{id:2,name:'tailor',code:'tailor123',appCode:21,}]
const output = input.reduce((a, obj) => {
  a[obj.code] = obj;
  return a;
}, {});
console.log(output);

答案 1 :(得分:1)

您可以使用Object.assign将数组映射到预期的键和值形状。尝试:

let array = [ 
   { 
    id: 1,
    name: 'pos',
    code: 'pos123',
    appCode: 22,
   },
  { 
    id: 2,
    name: 'tailor',
    code: 'tailor123',
    appCode: 21,
  } 
];

let output = Object.assign(...array.map(x => ({ [x.code]: x })));

console.log(output);

答案 2 :(得分:1)

var yourArray = [ 
 { 
  id: 1,
  name: 'pos',
  code: 'pos123',
  appCode: 22,
  },
 {  
  id: 2,
  name: 'tailor',
  code: 'tailor123',
  appCode: 21,
 } 
];

//this is what you required
var output =  yourArray.reduce((obj, item) => {
  obj[code] =item;
  return obj;
}, {});

答案 3 :(得分:0)

使用数组缩减功能



var data = [{
    id: 1,
    name: 'pos',
    code: 'pos123',
    appCode: 22,
  },
  {
    id: 2,
    name: 'tailor',
    code: 'tailor123',
    appCode: 21,
  }
]

var modData = data.reduce(function(acc, curr) {
  //acc is the empty array passed as argument
  // if empty array does not have a property pos123 or so 
  // create a key by this name
  if (!acc.hasOwnProperty(curr.code)) {
    // then add property to it
    acc[curr.code] = {
      id: curr.id,
      name: curr.name,
      appCode: curr.appCode
    }
  }

  return acc;

}, {})

console.log(modData)




答案 4 :(得分:0)

使用循环可以做到这一点。

const resp = [
   {
    id: 1,
    name: 'pos',
    code: 'pos123',
    appCode: 22,
   },
  {
    id: 2,
    name: 'tailor',
    code: 'tailor123',
    appCode: 21,
  }
]

let res = {};

for (let i = 0; i < resp.length; i++) {
  res[resp[i]['code']] = {
    id: resp[i]['id'],
    name: resp[i]['name'],
    appCode: resp[i]['appCode'],
    code: resp[i]['code']
  }
}

console.log(res);

答案 5 :(得分:0)

似乎其他解决方案在结果对象中包含&#39; code&#39; -property。这个没有

&#13;
&#13;
const test = [ 
  { 
   id: 1,
   name: 'pos',
   code: 'pos123',
   appCode: 22,
  }, { 
   id: 2,
   name: 'tailor',
   code: 'tailor123',
   appCode: 21,
  } 
];
const test2 = JSON.parse(JSON.stringify(test));
const result = document.querySelector("#result");

result.textContent = "**No redundancy\n" + JSON.stringify(
  test.reduce( (newObj, el) => 
    (newObj[el.code] = delete el.code && el) && newObj, {} 
  ), null, " ");

// alternative
result.textContent += "\n\n**Alternative\n" + JSON.stringify(
  test2.reduce( (newObj, el) => (newObj[el.code] = el) && newObj, {}
  ), null, " ");
&#13;
<pre id="result"></pre>
&#13;
&#13;
&#13;