【问题标题】:Iterate through and access both array and object elements with the same code使用相同的代码遍历并访问数组和对象元素
【发布时间】:2018-03-23 10:54:45
【问题描述】:

假设我有一个接收对象或数组的函数。我想遍历每个元素,并在执行过程中对每个元素做一些事情。我知道我可以使用 forEach() 或普通的 for 循环遍历数组。我还可以使用a for in loop 遍历对象和数组。但与数组情况不同,我必须使用hasOwnProperty() 检查对象的元素。

我可以只对数组和对象应用一些通用代码吗?

更新。这是我对一些名为 value 的对象/数组的尝试,但没有针对对象情况出现控制台消息:

keysArray = Object.keys(value);
for(let key in keysArray) {
    console.log(value[key])
}

【问题讨论】:

标签: javascript arrays iteration


【解决方案1】:

你可以使用

function* entries(o) {
    if (Array.isArray(o))
        for (let i=0; i<o.length; i++)
            yield [i, o[i]];
    else
        for (const p in o)
            yield [p, o[i]];
}
// or using builtin iterators:
function entries(o) {
    return Array.isArray(o) ? o.entries() : Object.entries(o).values();
}

并将其称为

for (const [key, value] of entries(something)) {
    console.log(key, value);
}

当然,您可以执行类似的操作来获取键或值。

【讨论】:

  • 谢谢@Bergi。我得查一下这个。 * 是否声明了一个生成器?
  • @chamilton 是的,那是generator function
【解决方案2】:
// whatever can be object or array

function doSth(whatever) {
  let myLoopable = whatever;

  // obj to array
  if (!Array.isArray(whatever)) {
    myLoopable = Object
      .keys(whatever) // get array of keys
      .reduce((acc, curKey) => [...acc, whatever[curKey]], []); // get array of values
  }

  myLoopable.forEach(value => console.log(value));
}

这是一个例子,不是最好的,你必须自己检查它是否是对象,以确保你的功能没有失败

【讨论】:

  • 我想你想要map,而不是reduce
  • map 是另一种选择:D。这取决于你
  • 嗯,在简单性、可读性和性能方面会有很大的改进……
  • 对于性能,我确定我不知道。为了简单和可读性,我相信它等于。 mapreduce 有各自的含义和方法。我必须同意大多数人对reduce 不满意,但这并不是因为复杂性。
  • 是的,它们有自己的含义 - 当您打算将数组映射到新数组时,您不应该使用 reduce
猜你喜欢
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 2016-12-08
  • 2012-08-13
  • 2021-01-14
相关资源
最近更新 更多