【问题标题】:How do you iterate over a JavaScript object's properties like an array?你如何像数组一样迭代 JavaScript 对象的属性?
【发布时间】:2017-01-02 22:20:44
【问题描述】:

我不是说使用键使用 for 循环。

例如,如果您有一个类似的数组:

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

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

所以如果我在 Bananas 上,我可以使用 prev 按钮获取苹果:

fruitArray[0] // Apples

Bananas 的索引为 1,但 prev 按钮将索引降低 1。

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

这样说:

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

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

所以如果我在香蕉上使用

fruitObject.Bananas // yellow

如何使用与 Array 相同的递减思路来获取 Apples?

我的问题不在于 for in 方法

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

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

解释一下:

这是一个对象

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

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

我希望能够开始/保持当前位置,就像我在 "blue":"berries" 一样,我可以在不知道 "red":"apple" 是什么的情况下跳到 "red":"apple"

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

类似

var tempArray = [];

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

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

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

colorObject.blue // blueberries

编辑感谢编辑让我的问题更清晰

我说得不好,所以这是我的责任。

【问题讨论】:

  • Object.keys(obj)
  • @SeinopSys 是的,我明白了,但这不是 0 到 1 的顺序,甚至可能不是数字,我想知道您是否必须创建一个具有 0-# 顺序的本地临时数组按对象的顺序与键配对。
  • @RadLexus 它不是重复的,这是我问题的第一行,我知道这就是你可以使用 for 循环通过这样的对象的方式,但我问的是左/右跳跃当前对象“索引”不执行 for 循环。
  • 对象元素的顺序无关紧要。我很确定,从 JS 的角度来看,对象 [a,b][b,a] 相同,因此如果您想跟踪其元素顺序,最好使用附加数组。
  • @Wh1T3h4Ck5 谢谢这是我决定采用的方法。我不确定是否有更有效的“官方”方式来做到这一点。就像在遍历数组时跟踪进度的一种方式一样,您可能会朝任一方向前进,而不仅仅是顺序。

标签: javascript object javascript-objects


【解决方案1】:

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

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

未指定枚举属性的机制和顺序,但必须符合下面指定的规则。

如果您要遍历 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 引擎将决定结果属性数组的顺序。

【讨论】:

  • 我找到了一个解决方案,我将创建一个临时查找数组以用于未知对象结构的增量/减量导航,但是是的,它确实用于 in 但它不是我原来的样子之后/已经知道了。是的......至少你可以创建新帐户。无论如何,感谢您理解我的要求。
【解决方案2】:

对象没有顺序,所以不能说fruitObject的第一个元素是“Apples”,第二个是“Bananas”,第三个是“Cocounts”。

您可以使用 Object.keys() 将键作为数组获取,然后执行类似的操作

var keys=Object.keys(fruitObject);
fruitObject[keys[0]];

请记住,在 JS 中,obj.keyobj["key"] 相同。

【讨论】:

  • 谢谢,这是一个有用的提示。
猜你喜欢
  • 2015-08-29
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
相关资源
最近更新 更多