如何在一个特定对象中转换对象数组?

时间:2018-04-13 18:15:47

标签: javascript arrays recursion

所以,在我上次的采访中,我有一个非常微小但很难完成的任务。我只是想知道如何解决它。我认为我们需要在这个任务中实现递归,但我不清楚它。

任务:

let arr = [{name: 'width', value: 300}, {name: 'height', value: 100}];

在输出时我们必须:

let obj = {width:300, height: 100};

数组对象的数量可以是无穷大。

P.S。 如果您向我提供有关如何完成此任务的知识的链接,我将感到高兴。

谢谢。

9 个答案:

答案 0 :(得分:5)

使用函数reduce

的替代方法

简要说明

  • 函数Array.prototype.reduce循环一个数组,为每个对象应用一个处理程序。
  • 累加器a将包含每次迭代的结果。
  • 函数converter接收累加器和当前对象。
  • Object.assign(a, {[name]: value})为当前累加器分配一个新属性。
  • 计算属性名称 {[name]: value}该代码将构建一个对象,如下所示:
{ width: 300 }



let arr = [{name: 'width', value: 300},{name: 'height', value: 100}],
    converter = (a, {name, value}) => (Object.assign(a, {[name]: value})),
    obj = arr.reduce(converter, {});

console.log(obj);

.as-console-wrapper { max-height: 100% !important; top: 0; }

<script src="https://codepen.io/synthet1c/pen/KyQQmL.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:3)

数组.reduce方法非常合适。从空对象开始,对于每个数组项,使用该键和值向对象添加条目。例如:

let arr = [{name: 'width', value: 300}, {name: 'height', value: 100}];

let result = arr.reduce((combo, item) => {
    combo[item.name] = item.value;
    return combo;
}, {});

console.log(result);

答案 2 :(得分:1)

首先,你在数组中的两个对象之间缺少一个逗号:)

每当您想要处理数组并提出单个值时,您都希望使用array.reduce。您可以选择方向(reduce或reduceRight)和累加器函数,以生成所需的值(或对象)。

答案 3 :(得分:1)

使用reduce,destructurization和object spread operator的另一种方法:

&#13;
&#13;
const src = [{
  name: 'width',
  value: 300
}, {
  name: 'height',
  value: 100
}]

const reducer = (acc, { name, value }) => ({
  ...acc,
  ...{ [name]: value }
});


const out = src.reduce(reducer, {});

console.log(out);
&#13;
&#13;
&#13;

答案 4 :(得分:0)

您可以通过在括号表示法的帮助下在数组中添加键值对来创建对象:

&#13;
&#13;
let arr = [{name: 'width', value: 300},{name: 'height', value: 100}];
 let obj = {};
 arr.forEach(pair => obj[pair.name] = pair.value)
 console.log(obj);
&#13;
&#13;
&#13;

答案 5 :(得分:0)

var len = arr.length, 

var newA = []; 
let width, height, item; 
for(var x = 0; x < len; x+=2){ //add 2 for pair loop because width/height in diff array objects 
 item.width = arr[x].value;
 item.height = arr[x+1].value; 
 newA.push(item); 
 // newA = [{width:value, height:value}, {width:value, height:value}];
}
console.log(newA);

这应该适用于在最终数组中将宽度和高度分组在一起:)

如果你只想要一个大对象(确保没有重复的名字!)......

var len = arr.length, 
obj = {}; 
for(var x = 0; x < len; x++){ 
 obj[arr[x].name] = arr[x].value;
} 
console.log(obj);

答案 6 :(得分:0)

您也可以使用forEach()来解决它。

let arr = [{name: 'width', value: 300},{name: 'height', value: 100}];
let obj = {};
arr.forEach(val=>obj[val.name]=val.value);

答案 7 :(得分:0)

您可以使用Array.map(){ [name]: value }的形式创建对象数组,并通过spreading将它们合并到一个对象Object.assign()

&#13;
&#13;
const arr = [{name: 'width', value: 300}, {name: 'height', value: 100}];

const object = Object.assign(...arr.map(({ name, value }) => ({ [name]: value })));

console.log(object);
&#13;
&#13;
&#13;

答案 8 :(得分:-1)

你可以用for循环来解决这个问题:

var obj = {};
for (var i=0; i<arr.length; i++){
    obj[arr[i].name] = arr[i].value;
}