繁体   English   中英

奇怪的行为推入存储在JavaScript对象值中的数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM