[英]Weird Behavior Pushing Into Array Stored in a JavaScript Object's Value
在else子句中,注释掉的行给出了期望的结果,但是下面的那个导致{'1':[1.3],'2':[2.1]}成为{'1':[1.3],' 2':2}。 我不明白为什么会这样。
const groupBy = (array, callback) => {
let obj = {}
for (let i = 0; i < array.length; i++) {
let currKey = callback(array[i])
let newVal = array[i]
let currVal = obj[currKey]
if (!currVal) {
obj[currKey] = [newVal]
} else {
// obj[currKey].push(newVal)
obj[currKey] = currVal.push(newVal)
}
}
return obj
}
// Uncomment these to check your work!
var decimals = [1.3, 2.1, 2.4]
var floored = function(num) { return Math.floor(num) }
groupBy(decimals, floored); // expect { 1: [1.3], 2: [2.1, 2.4] }
Array.prototype.push
不返回新数组,它返回数组的长度。
const groupBy = (array, callback) => {
// let arrayValues = [] // this isn't used anywhere
let obj = {}
for (let i = 0; i < array.length; i++) {
let currKey = callback(array[i])
let newVal = array[i]
let currVal = obj[currKey]
if (!currVal) {
obj[currKey] = [newVal]
} else {
obj[currKey].push(newVal) // this should work instead
//obj[currKey] = currVal.push(newVal)
}
}
return obj
}
由于数组是引用类型,您只需将新项目推入数组obj[currKey].push(newValue)
而无需再次设置obj[currKey]
。 你正在将一个新值推送到它存在于内存中的数组中,因此无需将其重新分配给任何内容。 你可以在这里看到lodash是如何做到的(尽管你必须解开一些辅助函数)。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.