【问题标题】:jquery: extend method with two objects - result is object Object?jquery:用两个对象扩展方法 - 结果是对象对象?
【发布时间】:2013-03-13 21:21:04
【问题描述】:

我正在 jQuery.com 上做一些 jQuery 教程,现在尝试理解扩展方法。它几乎可以工作。

var object1 = {
                apple: 0,
                banana: {weight: 52, price: 100},
                cherry: 97
                };

            var object2 = {
                banana: {price: 200},
                durian: 100
                };

            var obj =   $.extend(object1, object2);

            for(var key in obj) {
                alert('key: ' + key + '\n' + 'value: ' + obj[key]);

警告框给出以下输出:

  • 键:苹果值:0
  • key:香蕉值:[object Object]
  • key:樱桃值:97
  • key:榴莲值:100

第二个键值对应该是banana:200。有人可以解释为什么不是吗?提前致谢。

【问题讨论】:

    标签: jquery object extend for-in-loop


    【解决方案1】:

    bannana 是一个对象属性。因此,如果您扩展它,它将被秒替换。但是如果你想更新priceweight 属性,你必须像这样编写代码

    var obj = $.extend(true, object1, object2);
    

    【讨论】:

      【解决方案2】:

      警告框根本不显示嵌套对象。

      //Use this on your object before you alert
      alert(JSON.stringify(myObj));
      

      如果您使用 Chrome 或 Firebug,您可以使用 console.log(myObj) 而不是 alert 轻松查看此输出。您需要在 Windows 中按 Ctrl+Shift+J 来查看控制台。

      希望这会有所帮助!

      【讨论】:

        【解决方案3】:

        对象 Banana 将是:

        banana : {
          weight: 52,
          price: 200
        }
        

        $.extend 不会删除未被覆盖的键,它比这更聪明。所以重量仍然存在。

        它显示[object object] 的原因是因为没有toString() 方法并且alert 不知道如何对香蕉对象进行字符串化。如果您将这些值自己打印到控制台,这就是您所看到的。

        【讨论】:

        • 我还不确定我做了什么,但我使用了 ElGamed 建议的代码,它有点工作。但实际上香蕉的重量并没有在警告框中,只是价格200。
        【解决方案4】:

        它向您显示对象,因为它是对象并且不会深入。

        您可以通过添加以下内容轻松测试它:

        object2.banana.toString=function (){ return this["price"]; //only for object2's banana. just for demonstrating.
        

        完整代码:http://jsbin.com/esobuc/2/edit

        var object1 = {
                        apple: 0,
                        banana: {weight: 52, price: 100},
                        cherry: 97
                        };
        
                    var object2 = {
                        banana: {price: 200},
                        durian: 100
                        };
        
        object2.banana.toString=function (){ return this["price"]; 
        }
        
                    var obj =   $.extend(object1, object2);
        
                    for(var key in obj) {
                      alert('key: ' + key + '\n' + 'value: ' + obj[key]);}
        

        【讨论】:

          【解决方案5】:

          以下应该会有所帮助:

          // override banana with its price
          object2.banana = object2.banana.price
          
          // merge both objects
          var obj = $.extend(object1, object2);
          

          【讨论】:

            猜你喜欢
            • 2012-06-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-08-01
            • 1970-01-01
            • 2011-07-15
            • 2015-05-08
            • 2011-05-31
            相关资源
            最近更新 更多