【问题标题】:Object.entries with forEach to map array of objects returns undefined except when console.log is used使用 forEach 映射对象数组的 Object.entries 返回未定义,除非使用 console.log
【发布时间】:2018-02-12 13:18:07
【问题描述】:

我有一个包含键值对的对象数组,我想在每个对象中找到一个特定的键并返回值。

数组的一个样本:

filterCounties=[
  {
    "StateName": "Delaware",
    "CountyName": "Kent",
    "FIPS": 10001,
    "Eligibles_2017": 33292,
    "Eligibles_2018": 34938,
    "Penetration_2017": 0.107,
    "Penetration_2018": 0.123
  },
  {
    "StateName": "Delaware",
    "CountyName": "New Castle",
    "FIPS": 10003,
    "Eligibles_2017": 94030,
    "Eligibles_2018": 98080,
    "Penetration_2017": 0.128,
    "Penetration_2018": 0.164
  },
  {
    "StateName": "Delaware",
    "CountyName": "Sussex",
    "FIPS": 10005,
    "Eligibles_2017": 61964,
    "Eligibles_2018": 65990,
    "Penetration_2017": 0.082,
    "Penetration_2018": 0.097
  },
  {
    "StateName": "Delaware",
    "CountyName": "Pending County Designation",
    "FIPS": 10,
    "Eligibles_2017": 9,
    "Eligibles_2018": 0,
    "Penetration_2017": 0,
    "Penetration_2018": 0
  }
]

我正在寻找的关键是 Penetration_2018 - 我可以使用以下代码并使用 console.log 输出值

const mapTest = new Map(
      Object.entries(filterCounties).forEach(([key, value]) =>
        console.log((key, value["Penetration_2018"]))
      )
    );

这将输出值: console.log output

但是,如果我分配给一个变量,然后记录该变量

 const mapTest = new Map(
      Object.entries(filterCounties).forEach(
        ([key, value]) => (key, value["Penetration_2018"])
      )
    );
    console.log(`This is mapTest ${mapTest}`);

我得到没有值的 [object Map] - 我认为使用箭头函数时,return 是隐式的?

输出图像 - 有或没有字符串连接enter image description here

我最终想提取这些值以将它们分配给 Victory BarChart 的 Y 轴。感谢您提供任何见解/指导。

【问题讨论】:

  • 感谢您的快速回复 - 我已经尝试过,结果相同 - 只是再次尝试 - 将编辑帖子以显示输出图像。
  • forEach() 从不提供退货服务,除非您认为 undefined 是退货服务。使用map() 它总是提供回报。
  • 如果您想在改变 original 对象的元素后返回该对象,请参阅javascript - Why is .forEach returning undefined? - Stack Overflow

标签: javascript arrays


【解决方案1】:

几个问题:

  • forEach 总是返回 undefined。您需要改用map
  • (key, value["Penetration_2018"]) 不是一个元组,而是一个逗号运算符表达式,结果是 value["Penetration_2018"] 的值。请改用方括号表示法。
  • Map 在转换为字符串时没有有用的表示。您需要将其转换为数组或其他东西以获得更有用的字符串表示:

代码:

const mapTest = new Map(
    Object.entries(filterCounties).map(
        ([key, value]) => [key, value["Penetration_2018"]]
    )
);
console.log(`This is mapTest ${JSON.stringify([...mapTest])}`);

对于数组,更传统的做法是直接在数组上应用map,而为什么您仍然需要 Map 是个谜。如果您想要唯一值,请使用 Set:

const uniques = [...new Set(filterCounties.map(value => value["Penetration_2018"]))];
console.log(`This is uniques: ${uniques}`);

【讨论】:

  • 非常感谢@trincot 的详细解释——非常感谢。抱歉,我的解释没有更彻底 - 该数组大约有 3000 个县,单独计算时有许多重复的渗透值 - 因此 Set 在这种情况下不可行。
【解决方案2】:

Object.entries 在数组上毫无用处。如有必要,您可以使用数组 entries 方法。

我以为在使用箭头函数时,return 是隐式的?

具有简洁主体的箭头函数隐式返回表达式值,是的。但是,在您的第一个示例中,console.log 不返回任何内容,在这两个示例中,forEach 不返回任何内容。在第二个示例中,您将逗号运算符用于某种“元组”表示法,而 Map 构造函数需要数组。

您应该使用map 方法来映射对象数组,而不是尝试使用“forEach 映射对象数组”!

const mapTest = new Map(filterCounties.map((value, key) => [key, value.Penetration_2018]));
console.log('This is mapTest:', mapTest);

【讨论】:

  • 谢谢@Bergi - 非常感谢 - 我看到了我的问题,感谢您花时间解释。
【解决方案3】:

.forEach 不返回值或数组。尝试改用.map。此外,在这种情况下,您不需要 Javascript Map(它不能有重复的键),此外考虑到 Victory BarChart 似乎将 Array 作为数据(而不是 Map)。

这是我建议的更改:

const mapTest = filterCounties.map(
  element => ({'Penetration_2018': element['Penetration_2018']})
)

【讨论】:

    猜你喜欢
    • 2019-07-09
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2023-03-14
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多