2017-08-24 74 views
0

有一个我正在使用的练习,要求创建一个嵌套数组到对象中的函数。将嵌套数组转换为具有减少的对象

例输入:[['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]; 
    } 
} 

但没有工作,所以我找到了另一个解决方案,它使用的降低:

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

现在,我想我明白了减少如何工作,但从来没有真正搞乱它的对象,如何acc[curr[0]]是否工作?它开始作为一个空的对象,但我很困惑,什么acc是在第一次迭代之后。任何人都可以解释吗?

在此先感谢!

+0

什么不适用于第一个?你有错误吗?如果不是,结果如何? –

回答

1

“现在我想我明白了如何减少工作,但从来没有真正与它搞砸的对象,请问acc[curr[0]]工作?”

acc总是从先前迭代的返回值(或在第一次迭代,如果所提供的初始值,否则该第一阵列元素)。

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

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

+0

哎呀,我觉得我明白发生了什么,它只是它的语法抛弃了我: 'acc [curr [0]] = curr [1];'在第一次迭代之前的acc是'{} ,那么在第一个之后,'acc [curr [0]]'是'make',所以'[curr [0]]'在技术上'make'它只是将它设置为'acc'中的一个键。我有道理吗?不知道如何在这里表达我的想法。 编辑:OOOOOH从不知道。我现在知道了。 – user7496931

+0

@ user7496931:是的,我听到你的声音。仅供参考,您可以使用Object.assign和新的表达式评估语法将回调减少为一行。 '返回Object.assign(acc,{[curr [0]]:curr [1]})' – spanky

+0

...是的,我想你已经明白了。 – spanky

1

您可以使用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

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

因此,在短期,在降低acc变量的第一次迭代是您在传递给减少函数的第二ARG的对象。但是对于之后的每次迭代,acc的值是您在前一次迭代中回调的值。

1

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

所以一个简单的例子是像reduce([1,2,3], +, 0),只想值相加,作为蓄能器将开始为0,然后每个元素和为它。

在你的情况下,蓄压器是一个对象,所以当你遍历的第一个元素将是这样的:

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

,所以你用element[0]为重点改变累加器和element[1]作为值,将acc转换为{ make: 'ford' }

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); 

既然你回来给你传递同一个对象,默认情况下,A,B的引用, c将全部是对同一个对象的引用。您正在修改每个步骤的对象,因此没问题。

0

您的第一个函数看起来像它将以您使用的格式工作,我认为它不起作用,因为变量名称arr不存在。它应该是您传递给函数的参数array

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

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