【问题标题】:Copy an associative array in JavaScript在 JavaScript 中复制关联数组
【发布时间】:2012-05-03 11:37:14
【问题描述】:

我有以下代码用于将一个关联数组复制到另一个,

<script>

    var some_db = new Array();

    some_db["One"] = "1";

    some_db["Two"] = "2";

    some_db["Three"] = "3";

    var copy_db = new Array();

    alert(some_db["One"]);

    copy_db = some_db.slice();

    alert(copy_db["One"]);

</script>

但是第二个警报说“未定义”..我在这里做错了吗?请大家指点...

【问题讨论】:

  • javascript中没有关联数组。
  • JavaScript 数组不适用于非数字键。这就是.slice 不接他们的原因。改用普通对象,然后查看What is the most efficient way to clone a JavaScript object?
  • @Niko:数组从一开始就是对象......它们没有“转身”。
  • @FelixKling 谢谢,我错过了。更正了我的评论。
  • @Peter - 在询问更多问题之前,您确实应该接受一些问题的答案。

标签: javascript associative-array


【解决方案1】:

正如@Niko 在评论中所说,JavaScript 中没有任何关联数组。

您实际上是在数组对象上设置属性,这不是一个好主意。你最好使用一个实际的对象。

var some_db = {};
some_db["One"] = "1";
some_db["Two"] = "2";
some_db["Three"] = "3";

var copy_db = {}, prop;
// Loop over all the keys in the object
for (prop in some_db) {
  // Make sure the object has this value, and not its prototype
  if (some_db.hasOwnProperty(prop)) {
    copy_db[prop] = some_db[prop];
  }
}

许多库都实现了一个extend 函数,该函数正是这样做的(将键从一个对象复制到另一个对象)。最值得注意的是jQueryUnderscore.js。 Underscore.js 也有_.clone(obj),实际上是_.extend( {}, obj )

【讨论】:

    【解决方案2】:

    在 JavaScript 中,关联数组称为对象。

    <script>
        var some_db = {
           "One" : "1",
           "Two" : "2",
           "Three" : "3"
        };
    
        var copy_db = clone(some_db);
    
        alert(some_db["One"]);
    
        alert(copy_db["One"]);
    
        function clone(obj) {
            if (null == obj || "object" != typeof obj) return obj;
            var copy = obj.constructor();
            for (var attr in obj) {
                if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);
            }
            return copy;
        }
    </script>
    

    如果我使用 jQuery,我通常会使用 var copy_db = $.extend({}, some_db);

    小提琴证明: http://jsfiddle.net/RNF5T/

    Thanks @maja.

    【讨论】:

    • @FelixKling 谢谢你。固定。
    • 注意,该函数不会复制子对象
    • @iambriansreed 不,它没有。分配属性时,您需要再次调用您的 clone-Function。查看您更新的小提琴:jsfiddle.net/85Gbr 这将执行深层复制:jsfiddle.net/RNF5T
    • @maja - 不错。已更新。
    【解决方案3】:

    underscore.clone 可以提供帮助。它对字典对象或数组执行浅拷贝。

    var some_db = {
      "One" : "1",
      "Two" : "2",
      "Three" : "3"
    };
    
    copy_db = _.clone(some_db);
    

    【讨论】:

      【解决方案4】:

      如果你想使用JSON,你可以取这个'关联数组'对象:

      var assArray = {zero:0, one:1, two:2, three:3, what:'ever', you:'want'};
      

      然后像这样“克隆”它:

      var clonedObj = JSON.parse(JSON.stringify(assArray));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-23
        • 1970-01-01
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 2016-06-16
        • 2011-10-02
        相关资源
        最近更新 更多