使用相同的代码迭代并访问数组和对象元素

时间:2018-03-23 02:25:03

标签: javascript arrays iteration

让我们说我有一个接收对象或数组的函数。我想迭代每个元素,并在我去的时候对每个元素做一些事情。我知道我可以使用forEach()或正常for循环遍历数组。我还可以使用a for in loop遍历对象和数组。但与数组情况不同,我必须使用hasOwnProperty()检查对象的元素。

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

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

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

2 个答案:

答案 0 :(得分: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);
}

当然,你可以做类似的事情,只得到钥匙或只是价值。

答案 1 :(得分:1)

// 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));
}

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