在JavaScript中将obj数组转换为array数组

时间:2018-06-20 15:22:35

标签: javascript

我正在学习数组过滤,减少和映射方法。在做一些练习时我得到了结构。我有这样的对象数组

var p=[
  {
    "key": "a",
    "value": 4
  },
  {
    "key": "b",
    "value": 3
  },
  {
    "key": "c",
    "value": 3
  },
  {
    "key": "d",
    "value": 6
  },
  {
    "key": "e",
    "value": 1
  }
]

这就是我所做的

var column=p.reduce((accumulator, currentValue, currentIndex, array)=>{
var arr=[];
arr[currentValue.key]=currentValue.value;
console.log(accumulator)
return (accumulator.push(arr));
},[]) 
console.log(column)

我期望这样的数组

[['a',4],['b',3],['c',3],['d',6],['e',1]]

第一次迭代后,我得到了这个错误:

  

accumulator.push不是函数

我不知道我在做什么错。

4 个答案:

答案 0 :(得分:2)

获取[['a',4],['b',3],['c',3],['d',6],['e',1]]

使用.reduce

这是您在代码中使用的内容。代码的问题在于,您访问的是arr中不存在的索引,因为在上一行中,您将arr设置为空数组。您无需在reduce循环中使用数组arr。您应该将值直接推送到accumulator

  

reduce()方法对累加器应用函数

const res = p.reduce((acc, curr) => {
  acc.push([curr['key'], curr['value']]);
  return acc;
}, []);

const p = [ {"key": "a", "value": 4}, {"key": "b", "value": 3}, {"key": "c", "value": 3}, {"key": "d", "value": 6}, {"key": "e", "value": 1} ];

const res = p.reduce((acc, curr) => {
  acc.push([curr['key'], curr['value']]);
  return acc;
}, []);

console.log(res)
//[['a',4],['b',3],['c',3],['d',6],['e',1]]

使用.map

您也可以使用.map方法来获得相同的结果:

  

map()方法创建一个新数组,其结果是在调用数组中的每个元素上调用提供的函数。

const res = p.map(e => [e['key'], e['value']]);

const p = [ {"key": "a", "value": 4}, {"key": "b", "value": 3}, {"key": "c", "value": 3}, {"key": "d", "value": 6}, {"key": "e", "value": 1} ];

const res = p.map(e => [e['key'], e['value']])

console.log(res)
//[['a',4],['b',3],['c',3],['d',6],['e',1]]


获取{ 'a': 4, 'b': 3, 'c': 3, 'd': 6, 'e': 1 }

对于每个键/值对,您可以使用对象而不是使用数组。这样,您可以为键分配一个值并获得所需的结果:

{key: value, ...}

在您的情况下:

{ 'a': 4, 'b': 3, 'c': 3, 'd': 6, 'e': 1 }

使用.reduce

您可以使用.reduce方法执行此操作:

const obj = p.reduce((acc, curr) => {
  acc[curr['key']] = curr['value'];
  return acc;
}, {});

const p = [ {"key": "a", "value": 4}, {"key": "b", "value": 3}, {"key": "c", "value": 3}, {"key": "d", "value": 6}, {"key": "e", "value": 1} ];

const obj = p.reduce((acc, curr) => {
  acc[curr['key']] = curr['value'];
  return acc;
}, {});

console.log(obj)

使用.forEach

或使用简单的.forEach循环:

  

forEach()方法为每个数组元素执行一次提供的函数。

let obj = {};
p.forEach(e => obj[e['key']] = e['value']);

const p = [ {"key": "a", "value": 4}, {"key": "b", "value": 3}, {"key": "c", "value": 3}, {"key": "d", "value": 6}, {"key": "e", "value": 1} ];

let obj = {};

p.forEach(e => obj[e['key']] = e['value']);

console.log(obj);

答案 1 :(得分:0)

您可以使用map遍历数组并返回新对象。

var p = [{"key":"a","value":4},{"key":"b","value":3},{"key":"c","value":3},{"key":"d","value":6},{"key":"e","value":1}];
var result = p.map(({key,value}) => ({[key]:value}));

console.log(result);


如果要创建新对象,可以使用Object.assign()map()

var p = [{"key":"a","value":4},{"key":"b","value":3},{"key":"c","value":3},{"key":"d","value":6},{"key":"e","value":1}];
var result = Object.assign(...p.map(o => ({[o.key]:o.value})));

console.log( result );

文档:map()Object.assign()

答案 2 :(得分:0)

您的结果将是对象的数组,而不是数组的数组。虽然您可以修复实现以与reduce()一起使用,但使用map()则要简单得多:

var new_p = p.map(obj => {{[obj.key]: obj.value}});

如果要使用单个对象而不是对象数组,则可以使用reduce()

var new_p p.reduce((acc, obj) => {
    acc[obj.key] = obj.value;
    return acc;
}, {});

这假定所有键都是唯一的。如果重复任何键,则只会得到该键的最后一个值。

答案 3 :(得分:0)

您可以将Array.prototype.map()Object.values()组合使用

代码:

const p = [{"key": "a","value": 4},{"key": "b","value": 3},{"key": "c","value": 3},{"key": "d","value": 6},{"key": "e","value": 1}];
const result = p.map(o => Object.values(o));

console.log(result);