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 函数中的函数错误