我正在学习数组过滤,减少和映射方法。在做一些练习时我得到了结构。我有这样的对象数组
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不是函数
我不知道我在做什么错。
答案 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 );
答案 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);