【问题标题】:Finding Member Position in a JS Object在 JS 对象中查找成员位置
【发布时间】:2012-04-06 09:47:59
【问题描述】:

在 JS 对象中查找成员位置的最快方法是什么?

假设我有以下对象:

var myObject = {
    "apple": { "color" : "green", "shape" : "round" },
    "banana": { "color" : "yellow", "shape" : "long" },
    "orange": { "color" : "orange", "shape" : "round" },
    "kiwi": { "color" : "green", "shape" : "round" }
}

现在,如果我想知道香蕉的位置(即 2),我需要循环遍历对象还是有更快的方法?

更新:

感谢大家,我现在明白了对象中没有“顺序”的概念,我无法可靠地找到成员的位置。我也没有可能找到下一个或上一个成员。这一切都说得通……

所以我解决我的问题的方法是这样的:我遍历我的数组并将键提供给一个数组,我可以用它来跟踪我在对象中拥有的成员。

var fruits = new Array();
for (var key in myObject) {
    fruits.push(key);
}

【问题讨论】:

    标签: javascript object


    【解决方案1】:

    从技术上讲,“香蕉”没有固定的位置。您正在使用 JavaScript 对象来存储不保证任何顺序的数据。如果顺序很重要,您应该将内容存储在数组中。您必须执行以下操作:

    var myObjectArray = [
        { 'key' : 'apple', 'value' : { 'color' : 'green', 'shape' : 'round' } },
        { 'key' : 'banana', 'value' : { 'color' : 'yellow', 'shape' : 'long' } },
        { 'key' : 'orange', 'value' : { 'color' : 'orange', 'shape' : 'round' } },
        { 'key' : 'kiwi', 'value' : { 'color' : 'green', 'shape' : 'round' } }
    ]
    

    然后获取索引:

    var i;
    for(i = 0; i < myObjectArray.length; i++){
        if(myObjectArray[i].key === 'banana'){
            return i;
        }
    }
    

    【讨论】:

    • 感谢您的详细解释。可悲的是,我被我得到的对象的格式所困扰,无法将其更改为数组。 :(
    • @Steve - 您可以随时编写自己的翻译来制作具有您需要的格式的新对象。
    【解决方案2】:

    JavaScript 中的对象没有顺序。一旦你得到这些数据,你到底想做什么?因为如果您正在寻找对象中的第二个值,您可能不会总是得到相同的结果。

    【讨论】:

    • 谢谢,有道理...我真的不关心顺序,我只想找到对象中的前一个和下一个成员。我可以假设成员在此对象的生命周期内保持相同的顺序吗?因为我不在乎下次创建对象时顺序是否不同,只要我能弄清楚特定成员之前和之后的顺序。
    • 对象没有顺序,所以“上一个”和“下一个”在这里没有意义。我建议使用一个(对象)数组,这样可以很容易地得到它们的顺序。
    【解决方案3】:

    您不应该依赖具有强排序的对象键。规范不保证这一点,例如,某些以前版本的 Chrome 不支持排序。

    根据您的用例,您可以存储索引,也可以保留一个数组

    var myObject = { 
       apple: { index:0, color:"green" ...
    
    var myKeys = ["apple", "banana", ... ]
    var myObject = ...
    

    【讨论】:

    • 这被称为“对象”,JavaScript 没有“关联数组”。
    • @Rocket 我更改了答案以避免混淆,但我讨厌语义上的区别。推广这种区别的那篇“被认为有害的文章”是一堆绒毛,归结为“不要使用 for/in 循环,因为原型可以修改”和“使用 new Array() 没有意义”
    • 嗯?有一个区别,因为对象和数组是两个完全不同的东西。 {a:b} 不是一个数组,它可以像使用[] 一样访问。 for...in 不好,因为如果我使用 Object.prototype.test=3 会怎样(这就是为什么应该使用 hasOwnProperty)? new Array 可以,但[] 更好(而且可能更快)。
    • 而关联数组和数组也是两个完全不同的东西。因此,“语义”。我刚刚意识到您来自 PHP 领域,显然它们是同一回事。抱歉,如果这引起了一些混乱。我完全同意那篇文章的两个原则。但是'for/in'通常是不好的,除非你专门检查hasownproperty,因为只需要一些白痴修改Object.prototype来再次破坏你的代码。
    • 我同时使用 PHP 和 JavaScript。我只是不想让您将其他阅读本文的人与“错误”的术语混淆。
    【解决方案4】:

    我是这样做的

    var position = Object.keys(myObject).indexOf('banana');
    

    也许它可以帮助别人......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-08
      • 2019-04-07
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多