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

Javascript 使用相同的代码迭代并访问数组和对象元素,javascript,arrays,iteration,Javascript,Arrays,Iteration,假设我有一个函数,它接收一个对象或一个数组。我希望遍历每个元素,并在执行过程中对每个元素执行一些操作。我知道我可以使用forEach()或普通for循环遍历数组。我还可以使用遍历对象和数组。但与数组不同,我必须使用hasOwnProperty()检查对象的元素 我可以对数组和对象应用一些通用的代码吗 更新。这是我对某个名为value的对象/数组的尝试,但没有针对该对象案例显示控制台消息: keysArray = Object.keys(value); for(let key in keysArr

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

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

更新。这是我对某个名为value的对象/数组的尝试,但没有针对该对象案例显示控制台消息:

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

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();
}
当然,您也可以做类似的事情,只获取键或值。

您可以使用

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();
}
// 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));
}
当然,您也可以做类似的事情,只获取键或值

// 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));
}
这是一个例子,不是最好的,您必须自己检查它是否是对象,以确保您的函数没有失败


这是一个示例,不是最好的,您必须自己检查它是否是object,以确保您的函数没有失败

您可以使用
object。条目
。可能对您有用?显示一些您理解的代码,我们可以从中获取。“我必须使用hasOwnProperty()检查对象的元素”-否。不,是你。你可以使用
Object.entries
。也许对你有用?展示一些你理解的代码,我们可以从中获取。“我必须用hasOwnProperty()检查对象的元素”-否。不,是你。谢谢你@Bergi。我得查一下。
*
申报发电机了吗?@chamilton是的,谢谢你@Bergi。我得查一下。
*
是否声明了一个生成器?@chamilton是的,这是一个我想你想要的
map
,而不是
reduce
map
是另一个选择:D.这取决于你,这将是一个简单性、可读性和性能方面的巨大改进……对于性能,我肯定不知道。为了简单易读,我确信它等于
map
reduce
有各自的含义和方法。我必须同意,大多数人对
reduce
不满意,但这并不是因为复杂性。是的,它们有自己的含义-当您打算将数组映射到一个新数组时,您不应该使用
reduce
。我想您需要
map
,不
reduce
map
是另一种选择:D.这取决于您自己,它将在简单性、可读性和性能方面有很大的改进…对于性能,我肯定我不知道。为了简单易读,我确信它等于
map
reduce
有各自的含义和方法。我必须同意,大多数人对
reduce
不满意,但这并不是因为复杂性。是的,它们有自己的含义——当您打算将数组映射到新数组时,您不应该使用
reduce