你如何迭代JavaScript对象的属性,如数组?

时间:2017-01-02 22:20:44

标签: javascript object javascript-objects

我不是指使用密钥使用for循环。

例如,如果你有一个像:

这样的数组
var fruitArray = ["Apples", "Bananas", "Coconuts"],
    curFruit   = 0;

你可以"迭代"使用按钮,比如说你有一个上一个/下一个按钮,所有这些按钮都会递减/增加curFruit索引。

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

fruitArray[0] // Apples

香蕉的指数为1,但prev按钮会使指数下降一个。

所以使用未知长度的对象,而不是使用带编号的索引,你怎么能这样做?

说出来是这样的:

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

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

所以如果我在香蕉上使用

fruitObject.Bananas // yellow

我怎样才能使用与数组相同的减量思想来获取Apples?

我的问题与方法中的for

无关

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

我认为无论如何我找到了一个解决方案,虽然它可能不是直接/最有效的方式,但我会创建一个临时的本地"查找"。

解释:

这是一个对象

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

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

我希望能够在"blue":"berries"开始/保持当前位置,我可以跳到"红色":" apple"不知道"red":"apple"是什么

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

这样的东西
var tempArray = [];

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

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

tempArray[1]将返回"蓝色"我可以去" red"通过执行tempArray[0]解释为

colorObject.blue // blueberries

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

我做得很差,所以我就这么说。

2 个答案:

答案 0 :(得分:2)

这是不可能的。 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引擎将决定生成的属性数组的顺序,如果您这样做的话。

答案 1 :(得分:1)

对象没有顺序,所以你不能说fruitObject的第一个元素是“苹果”,第二个是“香蕉”,第三个是“Cocounts”。

您可以将密钥作为带Object.keys()的数组获取,然后执行类似

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

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