【问题标题】:JavaScript: Parameter not passed to Array.forEach inside of the function => undefined?JavaScript:参数未传递给函数内部的 Array.forEach => 未定义?
【发布时间】:2021-09-29 08:47:23
【问题描述】:

const data = {
  "desk": {
    "drawer": "stapler"
  },
  "cabinet": {
    "top drawer": { 
      "folder1": "a file",
      "folder2": "secrets"
    },
    "bottom drawer": "soda"
  },
  "item" : [
    {
      "hello" : {
        "world" : "isHere"
      },
      "test" : "1"
    },
        {
      "hello" : {
        "world" : "isHere2"
      },
      "test" : "2"
    },
    ]
};

const iterate = (obj) => {
  
    Object.keys(obj).forEach(key => {

    if (typeof obj[key] === 'object') {
            iterate(obj[key])
    } else{
        let value = obj[key];
        let newObj = {[key]: value, 'style' : {backGroundColor : 'red'}};
        delete obj[key];
        Object.assign(obj, newObj);
    }
    })
}

iterate(data);
console.log(data)

我写了一个递归函数,它应该用我在参数中指定的对象替换每个键值对(不是属性!)。

但是,如果我在函数内部使用 array.forEach 循环,则传递的 objundefined

我错过了什么?

示例


const iterate = (obj, newObj) => {

    Object.keys(obj).forEach(key => {

    if (typeof obj[key] === 'object') {
            iterate(obj[key])
    } else{
        delete obj[key];
        Object.assign(obj, newObj);
    }
    })
}

但是,如果我在 forEach 中定义对象,它会完美运行......

const iterate = (obj) => {

    Object.keys(obj).forEach(key => {

    if (typeof obj[key] === 'object') {
            iterate(obj[key])
    } else{
        let value = obj[key];
        
        // SEE HERE
        let newObj = {[key]: value, 'style' : {backGroundColor : 'red'}};

        delete obj[key];
        Object.assign(obj, newObj);
    }
    })
}

为什么Object.keys(obj).forEach在第一个版本中看不到传递的参数? 解决办法是什么?

【问题讨论】:

  • 请添加一些示例数据和预期结果。
  • @OriDrori 做到了。这是第二个版本,但是我想将一个新对象作为参数传递给函数,但是 .forEach 看不到范围。
  • 第一个代码中没有newObj 的声明。 value 未使用。这是一个错字吗?我收到错误消息ReferenceError: newObj is not defined"
  • @jabaa 是的,值已被删除。声明是什么意思?它作为参数给出,应该一直传递到我调用 Object.assign()
  • 分配给iterate 的匿名函数有两个参数,但您总是用一个参数调用它。参数newObj 始终为undefinedObject.assign(obj, newObj); 始终是 Object.assign(obj, undefined);

标签: javascript reactjs object scope


【解决方案1】:

每当您在Array.forEach() - iterate(obj[key], newObj) 中调用iterate 时,您都需要传递newObj

const data = {"desk":{"drawer":"stapler"},"cabinet":{"top drawer":{"folder1":"a file","folder2":"secrets"},"bottom drawer":"soda"},"item":[{"hello":{"world":"isHere"},"test":"1"},{"hello":{"world":"isHere2"},"test":"2"}]};

const iterate = (obj, newObj) => {
  Object.keys(obj).forEach(key => {
    if (typeof obj[key] === 'object') {
      iterate(obj[key], newObj)
    } else {
      // delete obj[key]; // remove for example purposes
      Object.assign(obj, newObj);
    }
  })
}

const newObj = {
  'style': {
    backGroundColor: 'red'
  }
};

iterate(data, newObj);
console.log(data)

【讨论】:

  • 谢谢!错过了。
猜你喜欢
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 2016-06-14
  • 2011-05-06
相关资源
最近更新 更多