【问题标题】:How do I get the main property of a javascript object?如何获取 javascript 对象的主要属性?
【发布时间】:2012-12-07 06:06:42
【问题描述】:

我正在开发一个从第三方网站提取数据的网站。我的 PHP 提取数据并用一个非常好的 JSON 对象进行响应。 然后,我使用 $.each 来遍历对象并对效果很好的数据进行排序。问题是我不知道如何提取主要属性。

示例 JSON 响应:

{
    "1234": {
        "all_sales": {"11/12/2012":"1211.33","11/13/2012":"2012.45"},
        "sales_total":"323.78",
        "store_number":"1234",
    },
     "5678": {
        "all_sales": {"11/12/2012":"1211.33","11/13/2012":"2012.45"},
        "sales_total":"323.78",
        "store_number":"5678",
    },

}

1234 和 5678 是商店编号。 我想要的是不需要 store_number 属性,只知道它是什么。 在 PHP 中会是这样的:

for ($data as $store_number => $store_data){
    //do whatever
}

我这样做是出于各种原因,但主要是因为我可以简单地调用 data.1234 或为前 10 名建立一个销售数组。现在 store_number 属性允许我这样做,但它的额外数据不是需要。

【问题讨论】:

    标签: javascript jquery arrays json object


    【解决方案1】:

    我想你想使用$.each回调函数的第一个参数:

    var a = { "1234": { ... }, "5678": { ... } };
    
    $.each(a, function(main, val) {
        console.log(main); // prints "1234" and "5678"
    });
    

    【讨论】:

    • 在我看来,在这里使用$.each 是很麻烦的。 Javascript 提供了in 运算符,可以在本机for 循环中使用。 for (var key in object) {}
    • 他们说他们已经在使用$.each 来迭代问题中的对象,这就是我在回答中使用它的原因。如果他们还没有使用它,我同意,只使用 forin 会更容易。
    • 如果作者回答了它,它会比得到 0 更让我烦恼,而 JQ 的答案得到 3+。当 JS 实际上更容易时,在 JQ 与 JS 方面变得有点愚蠢。不过@Xymotech 或 JQ 没有酸葡萄。
    • 这确实有效,我没有意识到您可以使用回调函数传递它们。我会将此作为正确答案,但使用普通的 for 循环是一种更轻松的方法。
    【解决方案2】:

    for x in 循环是完成这里工作的正确工具。我喜欢 jQuery,但是当 JavaScript 覆盖它时,不要甩掉 JQ-hammer。

    var myObj = {
        "1234": {
            "all_sales": {"11/12/2012":"1211.33","11/13/2012":"2012.45"},
            "sales_total":"323.78",
            "store_number":"1234",
        },
         "5678": {
            "all_sales": {"11/12/2012":"1211.33","11/13/2012":"2012.45"},
            "sales_total":"323.78",
            "store_number":"5678",
        },
    
    }
    
    for (var x in myObj) {
        alert('property:' + x);
        alert('property.sales_total:' + myObj[x].sales_total); 
    }
    

    【讨论】:

    • 可能还想使用if (myObj.hasOwnProperty(x)) {} :)
    • 对于对象字面量?据我所知,没有必要。
    • @ErikReppen 在极少数情况下是的 (Object.prototype.foo="bar")
    • @Ian 与由函数构造函数创建的对象相比,该对象可以具有定义为可枚举的构造函数原型的属性,而典型的文字不会。
    • @Christophe。细节很好,但我不包括做坏事的人。最好通过异常来了解它,以便您可以修复它。
    【解决方案3】:

    如果我理解正确,您需要一个包含“1234”、“5678”等值的数组:

    myArray=$.map(myJSON,function(value,key){return key;});
    

    [编辑]重新考虑,这可能更接近您所追求的:

    myArray=$.map(myJSON,function(value,key){
    // do whatever
    });
    

    正如@Ian 在评论中所说,您可能希望将所有处理分组在一个循环中(如我的示例中的 $.each 或 $.map )。

    【讨论】:

    • 我也绝对喜欢这个,这让 OP 如何处理这些循环感到困惑,但将所有逻辑组合到一个循环中而不是仅仅获取一组键 (取决于哪个对 OP 更有效)。我之所以这么说,是因为他们使用带有 PHP 的 for 循环示例,只是迭代键(而不是存储它们)。不过我一直很喜欢map
    • 这很令人困惑,但是因为您无法对对象进行排序,所以我根据销售总额构建数组,然后我可以将该数组排序为不同的订单,例如按销售总额的 DSC。然后我可以调用该排序数组并返回该位置的商店编号,这样我就可以调用该商店并获取其所有数据......我可能过于复杂了,但它目前工作得很好......
    • @DennisSmolek 这很有意义......现在你解释了你的原因:-)。我的第一个 sn-p 完全符合您的要求,只需一行!
    【解决方案4】:
    for (var key in object) {
        console.log(key);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-12
      • 2012-09-15
      相关资源
      最近更新 更多