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>

しかし、2番目のアラートは「未定義」と言っています。私はここで何か間違ったことをしていますか?ポインタをお願いします...

4

4 に答える 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>

私は通常、var copy_db = $.extend({}, some_db);jQueryを使用している場合に使用します。

フィドルプルーフ: http: //jsfiddle.net/RNF5T/

ありがとう@maja

于 2012-04-22T18:23:54.463 に答える
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 )

于 2012-04-22T18:21:23.290 に答える
3

JSONを使用する場合は、次の「連想配列」オブジェクトを使用できます。

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

そして、次のように「クローン」します。

var clonedObj = JSON.parse(JSON.stringify(assArray));
于 2014-01-15T20:24:37.300 に答える
0

underscore.cloneが役立つ可能性があります。ディクショナリオブジェクトまたは配列へのシャローコピーを実行します。

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

copy_db = _.clone(some_db);
于 2013-04-19T19:13:21.680 に答える