2012-04-22 2 views
7

я следующий кусок коды для копирования одного ассоциативного массива в другие,Скопируйте ассоциативный массив в javascript?

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

Но второе предупреждение говорит «неопределенный» .. Я делаю что-то здесь не так? Любые указатели, пожалуйста.

+5

В javascript нет ассоциативных массивов. – Niko

+6

Матрицы JavaScript не работают с нечисловыми ключами. Вот почему '.slice' их не забирает. Вместо этого используйте простой объект, а затем посмотрите на [Что является наиболее эффективным способом клонирования объекта JavaScript?] (Http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to- клонировать-A-JavaScript-объект). –

+1

@Niko: Массивы - это объекты с самого начала ... они не «повернуты». –

ответ

17

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

Fiddle Доказательство:http://jsfiddle.net/RNF5T/

Благодаря @maja.

+2

Это не создает копию ... –

+0

@FelixKling Спасибо. Исправлена. – iambriansreed

+0

Обратите внимание, что функция не копирует дочерние объекты – maja

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 функцию, которая делает именно это (ключи копирования от одного объекта к другому). В первую очередь jQuery и underscore.js. У подчеркивания также есть _.clone(obj), что эффективно _.extend({}, obj)

0

underscore.clone (http://underscorejs.org/#clone) может помочь. Он выполняет мелкую копию объекта или массива словаря.

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

copy_db = _.clone(some_db); 
2

, если вы хотите использовать JSON, вы можете взять этот ассоциативный массив "объект:

уаг assArray = {ноль: 0, один: 1, два: 2, три: 3, чем: 'когда-нибудь', вы: 'хотите'};

и 'клон', это так:

вар clonedObj = JSON.parse (JSON.stringify (assArray));

+1

heh, ass array ... – Ogen

Смежные вопросы