在JavaScript中复制一个关联数组

8

我有下面这段代码,用于将一个关联数组复制到另一个关联数组中:

<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>

但是第二个警告框显示"undefined"。我在这里做错了什么吗?请给我一些指导...

5
JavaScript 中没有关联数组。 - Niko
6
JavaScript数组不支持非数值键,这就是为什么.slice无法获取它们的原因。可以使用普通对象代替,然后参考“最有效地克隆JavaScript对象的方法是什么?”(https://dev59.com/83VD5IYBdhLWcg3wAGiD)。 - Felix Kling
1
@Niko:数组从一开始就是对象...它们不会被“转换”。 - Felix Kling
@FelixKling 谢谢,我漏掉了那个。我已经更正了我的评论。 - Niko
@Peter - 在提出更多问题之前,你真的应该接受一些问题的答案。 - gnarf
谢谢大家的回复。我已经将我的代码更改为Object,现在运行良好。@gnarf 抱歉我不知道这里要加+1。从现在开始会注意的 :) - Naveen
4个回答

18

在 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/

感谢 @maja


@FelixKling 谢谢,好的。已修复。 - iambriansreed
请注意,该函数不会复制子对象。 - maja
@iambriansreed 不,它不会。当分配属性时,您需要再次调用克隆函数。请参阅您更新的fiddle:http://jsfiddle.net/85Gbr/ 这将执行深层复制:http://jsfiddle.net/RNF5T/ - maja
@maja - 好的,已更新。 - iambriansreed

4
如果您想使用JSON,可以使用这个“关联数组”对象:
var assArray = {zero:0, one:1, two:2, three:3, what:'ever', you:'want'};

并且像这样进行“克隆”:

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

4
如评论中@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 )

0

underscore.clone 可以帮助你。它执行浅复制到字典对象或数组。

var some_db = {
  "One" : "1",
  "Two" : "2",
  "Three" : "3"
};

copy_db = _.clone(some_db);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接