Javascript通用For循环

Javascript通用For循环,javascript,arrays,generics,for-loop,javascript-objects,Javascript,Arrays,Generics,For Loop,Javascript Objects,有没有办法创建一个泛型for循环来正确循环数组或对象?我知道我可以为循环编写以下内容,但它也将循环通过将添加到数组中的其他属性 for (item in x) { console.log(item) } 我的意思是一个for循环,它将迭代: x = [1, 2] x.foo = "foo" y = {first:1, second: 2} x as y as 这背后的原因是直到运行时我才知道x是什么(数组或对象)。是否是创建在运行时检查的函数的唯一选项?使用 在数组上迭代 在对象上迭代

有没有办法创建一个泛型for循环来正确循环数组或对象?我知道我可以为循环编写以下内容,但它也将循环通过将添加到数组中的其他属性

for (item in x) {
   console.log(item)
}
我的意思是一个for循环,它将迭代:

x = [1, 2]
x.foo = "foo"
y = {first:1, second: 2}
x as

y as

这背后的原因是直到运行时我才知道x是什么(数组或对象)。是否是创建在运行时检查的函数的唯一选项?

使用

在数组上迭代 在对象上迭代 无论如何,从代码样式的角度来看,在对对象进行迭代之前,仍然应该检查对象是否是数组。你可以用它来实现这一点。因此,假设
数据
是对象或数组:

if (Array.isArray(data)) {
    for (const element of data) {
        // Iterate over array
    }
}
else {
    for (const [key, value] of Object.entries(data)) {
        // Iterate over object
    }
}
通用循环 由于在JavaScript中,
typeof[]==“object”
(即数组是使用元素索引作为其键的对象),因此可以使用以下方法将其简化为一个单循环


但是要注意,后一种方法不能公正地排除动态属性(例如,
array.foo
),因为您将迭代
Object.entries
的结果。如果确实需要进行此排除,请使用两个
for..of
循环和
Array.isArray
进行排除,如上所示

如果只是根据预期输出所需的索引/键值,那么这里有一个简单的一行代码

function loop(x) {
  return (Array.isArray(x) ? x : Object.keys(x)).forEach(el => console.log(el));
}

loop(x); // 1 2
loop(y); // First Second

如果你不知道你在处理什么类型的问题,你应该试着让自己处于一个你知道你在处理什么类型的问题的位置。这是防止同事误杀的最简单的方法。我绝对同意你的评论。清晰总是需要的。产生歧义的原因是我正在为一种动态语言编写一个编译器,该语言可以编译成Javascript。因此,我不一定知道循环源的类型,所以我需要一种通用的方法来创建一个在运行时可以工作的for循环。。因此,在您的情况下,将数组甚至函数视为对象可能更明智,因为它们之间没有真正的区别。在上面的例子中,
x=[1,2];x、 foo=“foo”对象。键(x)将列出您的
[“0”、“1”、“foo”]
,但his不会显示不可枚举的
长度属性。在某些情况下,您可以选择使用
Object.getOwnPropertyNames(x)[“0”、“1”、“length”、“foo”]
const array = [1, 2];
array.foo = "test";
for (const number of array) {
    console.log(number); // skips array.foo
}
const object = {
    some: "string",
    number: 42
};
for (const [key, value] of Object.entries(object)) {
    console.log(key, value);
}
if (Array.isArray(data)) {
    for (const element of data) {
        // Iterate over array
    }
}
else {
    for (const [key, value] of Object.entries(data)) {
        // Iterate over object
    }
}
for (const [key, value] of Object.entries(data)) {
    // For arrays, `key` will be the index
}
function loop(x) {
  return (Array.isArray(x) ? x : Object.keys(x)).forEach(el => console.log(el));
}

loop(x); // 1 2
loop(y); // First Second