javascript - 如何像数组一样迭代 JavaScript 对象的属性?

标签 javascript object javascript-objects

我的意思不是使用键来使用 for 循环。

例如,如果您有一个像这样的数组:

var fruitArray = ["Apples", "Bananas", "Coconuts"],
    curFruit   = 0;

您可以使用按钮“迭代”它,假设您有一个上一个/下一个按钮,所有这些按钮所做的就是递减/递增 curFruit 索引。

因此,如果我使用香蕉,我可以使用上一个按钮获取苹果:

fruitArray[0] // Apples

香蕉的索引为 1,但上一个按钮会将索引降低 1。

那么对于一个未知长度的对象,并且不使用编号索引,你怎么能做到这一点?

说得像这样:

var fruitObject = {"Apples":"Red", "Bananas":"Yellow", "Coconuts":"Brown"};

我意识到您可以设置 0、1、2 和水果名称,但这只是为了表明您不知道对象键/索引可能是什么。

所以如果我吃香蕉

fruitObject.Bananas // yellow

如何使用与数组相同的递减思想来获取苹果?

我的问题不是关于 for in 方法

我不知道为什么这不清楚,这实际上是我问题的第一行。

我想我无论如何都找到了一个解决方案,尽管它可能不是直接/最有效的方法,我将创建一个临时的本地“查找”。

解释一下:

这是一个对象

var colorObject = {"red":"apple", "blue":"blueberries", "yellow":"banana"};

我不想使用 for in 方法从左到右完成。

我希望能够开始/保持当前位置,就像我在 "blue":"berry" 一样,并且我可以跳到 "red":"apple"而无需知道“红色”:“苹果”

我当前想到的解决方案是,是的,尽管具有讽刺意味的是,我会使用 for in 方法,但要创建一个查找数组。

类似于

var tempArray = [];

for (var key in colorObject) {
  tempArray.push(key);
}

然后我可以使用增量/减量方法从任何地方开始导航对象。

tempArray[1] 将返回“蓝色”,我可以通过执行 tempArray[0] 来返回“红色”,这被解释为

colorObject.blue // blueberries

编辑感谢编辑使我的问题更加清晰

我的措辞不好,所以这是我的责任。

最佳答案

这是不可能的。 JavaScript object properties do not have a defined order ,所以不存在Y键在X键之后的概念。

Excerpt from EnumerateObjectProperties section of ECMAScript 2017 Draft (ECMA-262) (强调):

The mechanics and order of enumerating the properties is not specified but must conform to the rules specified below.

如果您要迭代 fruitObject 对象的属性,“Bananas” 可能会也可能不会出现在 “Coconuts” 之前,这种行为根本不是由规范定义的。甚至似乎无法保证每次迭代属性时属性都会以相同的顺序返回。

获得一致顺序的唯一方法是使用数组。或者,您可以通过 Object.keys 创建属性数组来完成此操作。 .

var fruitObject = {"Apples":"Red", "Bananas":"Yellow", "Coconuts":"Brown"};

// Get the property keys in an ordered list:
var fruitObjectKeys = Object.keys(fruitObject);

// An array of properties with a consistent order:
fruitObjectKeys.forEach(function(prop) {
    console.log(prop, '=', fruitObject[prop]);
});

但请注意,如果您这样做,运行代码的 JavaScript 引擎将决定生成的属性数组的顺序。

关于javascript - 如何像数组一样迭代 JavaScript 对象的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41433956/

相关文章:

javascript - Bootstrap Modal 关闭后刷新

javascript - 我可以从 setTimeout() 调用 setState() 吗?

Javascript 对象引用种类的最后一个对象而不是自身

javascript - 对象和 console.log 的奇怪行为

JavaScript - 有什么方法可以动态创建对象的新实例吗?

javascript - 在 JavaScript 中复制一个子对象

javascript - filterAll() 和 dc.redrawAll() 不适用于 dc.pieChart

javascript - $$hashKey 匹配和选择菜单的选定值

Java 返回一个对象

javascript - Object.assign() 与 angular.extend()