JavaScript中是不是有类似forEach的函数,但它只返回索引,而不是对象和索引[关闭]

Posted

技术标签:

【中文标题】JavaScript中是不是有类似forEach的函数,但它只返回索引,而不是对象和索引[关闭]【英文标题】:Is there forEach-like function in JavaScript, but which returns only index, but not object and index [closed]JavaScript中是否有类似forEach的函数,但它只返回索引,而不是对象和索引[关闭] 【发布时间】:2019-05-30 06:39:19 【问题描述】:

我不知道,javascript 中是否有任何函数,它只是迭代一个对象并返回一个索引。例如:

[1, 2, 3].iterate(index => /* do smth */)

如果没有这样的功能,为什么?我认为这可能只是表示for 循环的另一种方式,它有它的位置。

编辑:

注意,我知道我们可以声明自己的iterate 函数,问题是有没有类似,如果没有为什么它不存在

编辑 2:

我知道有forEach 函数,但它会用obj, index, array 进行回调,所以我们总是必须声明一些obj。在这种情况下,您需要忽略obj,这是一个不必要的操作。

[1, 2, 3].forEach( (obj, i) => console.log(i) ) //we don't need an obj

所以这里我们忽略obj。它在记忆中占有一席之地,并且不会在云中的某个地方飞行。忽略obj 并使用简单的forEach 不是答案,请停止使用默认forEach 回答。

【问题讨论】:

您看过forEach 方法吗?你也可以做Object.keys 并对其进行迭代? 有这样的功能。它被称为forEach。您只需在回调中使用第二个函数参数。 [1, 2, 3].forEach((_, index) => /* do smth */) 我不认为这样的函数存在,因为遍历索引与从 0 迭代到 array.length 是一样的,我几乎想不出一个用例。数组。[地图 | foreach](function(item, index) ... ),你可以在你的用例中使用它 很难看出忽略参数如何算作操作。 “为什么[编程语言]没有[我迫切需要并且可以很容易地用我自己的东西替代的利基特性]?”很少是建设性的问题,几乎总是无法回答。 【参考方案1】:

您是否实际上只尝试获取数组中的索引,如果是这样,您可以使用您在此实现中看到的第一种方法,如果您可能想要获取键和值,那么您可以使用我也提供的forEach 方法。

解释

您现在可能已经猜到了,使用Object.keys 函数,它将返回一个已传递给函数的对象的键数组,在这种情况下,数组只有数字作为键,因此它返回一个索引数组,然后您可以根据需要循环该数组。

这是我提供的第一种方法的要点。

注意

正如@Szab 所说,如果 Array 对象以某种方式被操纵,因此它可能有也可能没有额外的属性,那么这个解决方案可能无法按预期执行。但在我个人看来,你不应该首先这样做,但这仍然是一个值得注意的点!

编辑

您可以做的另一个解决方案是利用@JLRishe 提供的解决方案,您可以在其中向Array.prototype 添加一些功能,这样您也可以使用类似forEach 的方法。

const array = ['fds', 'dsa', 'dsfsd'];

// A solution by @JLRishe
Array.prototype.forEachIndex = function(cb) 
  this.forEach((_, i) => cb(i));
;


// Demo.
Object.keys(array).forEach(i => console.log(i));
array.forEach((i, index) => console.log(i, index));
array.forEachIndex(i => console.log(i));

【讨论】:

请注意Object.keys 方法可能会产生不正确的结果,如果出于任何原因使用任何附加属性扩展数组对象。 实际上,这正是我要问的。我不知道为什么人们会生气并否决我的问题。我不想forEach!!! @V.Dalechin 您希望如何在不使用 forEach 或 for 循环的情况下迭代数组? 这个答案在内存使用方面比forEach 差,这似乎是 OP 所担心的。 Object.keys 创建一个完全新数组,并用原始数组中所有数字索引的副本 填充它。如果您有一个包含 100,000 个项目的数组,forEach 几乎不会产生任何开销。如果您使用Object.keys(x).forEach,您将创建一个包含 100,000 个字符串的 100,000 项数组,以便您可以开始迭代原始数组。 @V.Dalechin 是的,如果您担心内存使用情况,这真的很糟糕,可以说是迭代数组索引的最糟糕的方法。您应该使用for 循环或Array.prototype.forEach【参考方案2】:

也许这就是你想要的:

[1, 2, 3].forEach((value, index) => console.log(index + " " + value));

【讨论】:

【参考方案3】:

实际上,forEach 的工作方式类似。它将三个参数传递给提供的回调 - 第一个是当前元素,第二个是它的索引,第三个是整个数组。

let example = [1, 2, 3];
example.forEach((item, index) =>  
    console.log(`Item $item, index $index`); 
);

【讨论】:

【参考方案4】:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

forEach() 方法对每个数组元素执行一次提供的函数。

var array1 = ['a', 'b', 'c'];

array1.forEach(function(element, index) 
  console.log(index, element);
);

【讨论】:

是的,但如果我只需要索引,我将不得不忽略element,我什至不需要存在。

以上是关于JavaScript中是不是有类似forEach的函数,但它只返回索引,而不是对象和索引[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的 TypeError:forEach 不是 javascript 函数中的函数错误

[].forEach.call() 在 JavaScript 中做了啥?

forEach 不是函数 javascript

C 是不是有“foreach”循环结构?

为什么 NodeList 不是数组?

qt 循环函数都有哪些?像c语言的for while类似的那种?