2009-10-23 3 views
6

ci-dessous dans une console Javascript:totalement basique question référence Javascript

var a = {'foo': []}; 
var b = {}; 

for (var key in a) { 
    b[key] = a[key]; 
} 

a['foo'].push(1); 

console.log(b); 

Rendement:

Object foo=[1]

Je veux faire une copie en valeur en b de chaque tableau pour chaque clé une. Y a-t-il un moyen plus facile?

+0

Comment obtenez-vous un « javascript console"? – OscarRyz

+0

Oscar - en utilisant Firebug dans Firefox, ou l'inspecteur Web de Safari. – Wells

+0

@Oscar: Vous avez besoin de FireBug pour la fonction 'console.log' pour fonctionner. –

Répondre

0

manière plus facile:

var a = {'foo': []}; 
var b = a; 

a['foo'].push(1); 

console.log(b); 

sortie est le même.

Edit:

var a = {'foo': []}; 
var b = {}; 

for (var key in a) { 
    if (a.hasOwnProperty(key)) { 
     b[key] = []; 
     for (var i = 0; i < a[key].length; i += 1) { 
      b[key][i] = a[key][i]; 
     } 
    } 
} 

a['foo'].push(1); 

console.log(b); 
+0

Anatoliy: Je ne veux pas simplement être une référence à un; Je veux que b soit une copie unique par la valeur des tableaux stockés dans un afin que lorsque je pousse dans ses tableaux, cela n'affecte pas b. – Wells

+0

Fixe. Actuellement, la sortie est un objet avec un tableau vide. – Anatoliy

+1

Vous pouvez simplifier tout ce truc en copie profonde avec 'une [clé] .slice (0)'. –

4

Vous pouvez faire un "clone" fonction qui crée une nouvelle objet, sur la base du objet originalconstructor, puis clone propriétés d'objet d'origine aussi si ce sont des objets:

function clone(obj){ 
    if(typeof(obj) != 'object' && obj != null) 
    return obj; // return the value itself if isn't an object 
       // or null, since typeof null == 'object'; 

    var temp = new obj.constructor(); 

    for(var key in obj) 
     temp[key] = clone(obj[key]); 
    return temp; 
} 


var a = {'foo': []}; 
var b = clone(a); 

a['foo'].push(1); 

console.log(b); // Object foo=[0] 
+0

J'ai déjà rencontré ce problème, et c'est exactement ainsi que je l'ai résolu. +1 – NateDSaint

+1

Le prototypage brise ceci. Simplement 'Object.prototype.foo = function() {};' va créer une récursion infinie. –

+0

@Jonathan: ajout d'une instruction if pour arrêter la récursivité. – CMS

0

Comme cela va ajouter le support pour les tableaux profonds de copie dans votre code:

var a = {'foo': []}; 
var b = {}; 

for (var key in a) { 
    if (Object.prototype.toString.call(b[key]) === "[object Array]") { 
     b[key] = a[key].slice(0); 
    } else { 
     b[key] = a[key]; 
    } 
} 

a['foo'].push(1); 

console.log(b);