我正在使用的练习要求在对象中创建嵌套数组的函数。
示例输入:[['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
的含义感到困惑。有人可以解释一下吗?
提前致谢!
答案 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];
}
}