使用reduce将嵌套数组转换为对象

时间:2017-08-24 21:28:55

标签: javascript arrays object reduce

我正在使用的练习要求在对象中创建嵌套数组的函数。

示例输入:[['make', 'Ford'], ['model', 'Mustang'], ['year', 1964]] 预期输出:{ make: 'Ford', model: 'Mustan', year: 1969 }

我试着写这个:

function fromListToObject(array) {
    let obj = {};

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

但那不起作用,所以我找到了另一个解决方案,它使用了reduce:

function fromListToObject(array) {
  return array.reduce(function(acc, curr) {
    acc[curr[0]] = curr[1];
    return acc;
}, {});
}

现在我以为我理解了reduce是如何工作但从未真正弄乱它的对象,acc[curr[0]]如何工作?它最初是一个空对象,但我对第一次迭代后acc的含义感到困惑。有人可以解释一下吗?

提前致谢!

6 个答案:

答案 0 :(得分:0)

您可以使用array作为变量名称并返回obj

function fromListToObject(array) {
    let obj = {};

    for (var i = 0; i < array.length; i++) {
        obj[array[i][0]] = array[i][1];
    }
    return obj;
}

console.log(fromListToObject([['make', 'Ford'], ['model', 'Mustang'], ['year', 1964]]))

答案 1 :(得分:0)

  

&#34;现在我以为我理解了如何减少工作但从未真正搞砸过对象,acc[curr[0]]如何工作?&#34;

acc始终是前一次迭代的返回值(或者在第一次迭代时,如果提供则为起始值,否则为第一个数组元素。)

因为您始终返回acc,这是您开始使用的{},因此acc始终是该起始对象。

curr是数组中的当前项,它是包含您要添加到acc对象的键和值的子数组。

答案 2 :(得分:0)

Reduce为您的回调函数提供了一个对象。然后你的回调函数需要返回一个对象,然后在下一次迭代时再次传递给你的回调。所以就像使用数组一样,您可以根据需要修改对象。

简而言之,在reduce的第一次迭代中,acc变量是传递给reduce函数的第二个arg的对象。但是对于之后的每次迭代,acc的值都是回调在前一次迭代中返回的值。

答案 3 :(得分:0)

reduce将传递给它的函数应用于给定列表的每个元素。该函数接收元素和累加器。最后你得到一个结果。

所以一个简单的例子就像reduce([1,2,3], +, 0)一样,只是对值进行求和,因为累加器将从0开始,然后将每个元素与它相加。

在你的情况下,累加器是一个对象,所以当你遍历第一个元素时,它会是这样的:

acc = {}
element = ['make', 'ford']

因此您使用element[0]作为关键字来更改累加器,并使用element[1]作为值,将acc转换为{ make: 'ford' }

答案 4 :(得分:0)

reduce获取函数和初始值。为数组中的每个元素调用该函数,并返回该步骤的结果。第一个调用传递给传递给reduce()的初始值,并且每个其他调用都传递给前一个函数调用的结果。

所以在你的情况下,它会像这样扩展(其中f是你传递的函数):

let default = {};
let a = f(['make', 'Ford'], default); // initial call uses default value
let b = f(['model', 'Mustang'], a); // uses result of previous call
let c = f(['year', '1964'], b);

由于您返回对传递的同一对象的引用,因此default,a,b和c都将引用同一对象。您正在修改每个步骤中的对象,这样就可以了。

答案 5 :(得分:0)

你的第一个函数看起来会以你使用的格式运行,我认为它没有用,因为变量名arr不存在。它应该是array传递给函数的参数。

function fromListToObject(array) {
  let obj = {};

  for (var i = 0; i < array.length; i++) {
    obj[array[i][0]] = array[i][1];
  }
}