【问题标题】:JavaScript. Cannot iterate an object with Object.keys () to get newJavaScript。无法使用 Object.keys () 迭代对象以获取新对象
【发布时间】:2018-06-12 17:16:40
【问题描述】:

输入有一个对象,如何在已有对象的基础上返回修改后的对象?

为此,我将Object.keys() 与迭代器map() 结合使用。但是有些东西不起作用,我不确定。

let objjjj = {
  a: 2,
  b: 3,
  c: 4
}

console.log(
  Object.keys(objjjj).map((key, i) => {
    key: objjjj[key] + 1
  })
)

【问题讨论】:

  • 返回对象的箭头函数必须在括号中包含所述对象,以区别于代码块。另请注意,您当前的代码将产生的结果(带有所述括号)非常奇特。最有趣的是您不使用计算属性名称,即所有对象都有一个名为key 的属性。最后但最不重要的是,您记录了一组对象(每个属性一个),这听起来根本不像您想要的。
  • Object.keys(objjjj).forEach(key => objjjj[key]++);

标签: javascript iterator


【解决方案1】:

您需要一些括号将大括号括在 arrow functions 中。

否则它被视为块语句,其中undefined 的标准返回发生。

对于创建单个对象,您可以将单个对象传播到Object.assign

let object = { a: 2, b: 3, c: 4 };
    
console.log(
    Object.assign(...Object.keys(object).map((key, i) => ({ [key]: object[key] + 1 })))
);

虽然您需要 key 和 value,但您可以使用 Object.entries

let object = { a: 2, b: 3, c: 4 };
    
console.log(
    Object.assign(...Object.entries(object).map(([k, v]) => ({ [k]: v + 1 })))
);

【讨论】:

  • 谢谢,但我需要新的 obj,而不是在里面创建额外的对象。我的意思是const obj = { 'key': 3, "key": 4 ....}
  • 它不适用于相同的键。请添加一个可能的替代结果。
  • 我不需要相同的键。就像上面的问题示例一样
  • 你想要哪些键名?
  • @J.Pichardo,这只是一种新方法。
【解决方案2】:

当你从箭头函数返回一个对象时,你必须用括号括起来:

let obj = {
  a: 2,
  b: 3,
  c: 4
}

console.log(
  Object.keys(obj)
  .reduce((acc, key) => ({
    ...acc,
    [key]: obj[key] + 1
  }), {})
)

// Or by using Object.entries


console.log(
  Object.entries(obj)
  .reduce((acc, [key, value]) => ({
    ...acc,
    [key]: value + 1
  }), {})
)

更新:

根据其他答案的评论,您可以使用 reduce 和扩展运算符将一个对象完全映射到另一个对象。

【讨论】:

    【解决方案3】:

    您需要返回值而不是再次分配给键。

    let objjjj = {
      a: 2,
      b: 3,
      c: 4
    }
    
    console.log(
      Object.keys(objjjj).map((key, i) => {
        return objjjj[key] + 1
      })
    )

    【讨论】:

      猜你喜欢
      • 2014-01-01
      • 2020-04-16
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多