concat (в JavaScript) не работает для ассоциативных массивов - PullRequest
10 голосов
/ 20 августа 2009

У меня проблема с объединением двух ассоциативных массивов в JavaScript. Ниже приведен пример кода:

var firstArray =  new Array();
firstArray.c1 = "sam";  
firstArray.c2 = "kam";
var secArray =  new Array();
secArray.c3 = "sam";    
secArray.c4 = "kam";
var res = firstArray.concat(secArray);

Это известное ограничение?

Какой лучший способ добиться этого?

Ответы [ 5 ]

20 голосов
/ 20 августа 2009

Вы не используете Array функциональность - просто Object функциональность. В JavaScript Object является ассоциативным массивом - вы используете Array для массивов, проиндексированных целыми числами. Если вы сделали

var firstArray =  new Array();
firstArray.push("sam");  
firstArray.push("kam");
var secArray =  new Array();
secArray.push("sam");    
secArray.push("kam");
var res = firstArray.concat(secArray);

тогда concat будет работать как положено.

Если вы действительно хотите объединить ассоциативные массивы, выполните:

for (var attr in src_array) { dest_array[attr] = src_array[attr]; }

Это, конечно, перезапишет существующие ключи в dest_array, которые имеют аналоги в src_array.

3 голосов
/ 20 августа 2009

Попробуйте это,

var firstArray = new Array("sam","kam");
var secArray = new Array("sam","kam");
var res = firstArray.concat(secArray);
1 голос
/ 20 августа 2009

Массивы в JavaScript имеют только числовые ключи. Только объекты могут иметь не числовые свойства. Так что попробуйте это вместо:

var firstArray = {};
firstArray.c1 = "sam";
firstArray.c2 = "kam";
var secArray =  {};
secArray.c3 = "sam";  
secArray.c4 = "kam";

for (var prop in secArray) {
    if (secArray.hasOwnProperty(prop)) {
        firstArray[prop] = secArray[prop];
    }
}
1 голос
/ 20 августа 2009

Строго говоря, это вовсе не ассоциативные массивы: это массивы нулевой длины с дополнительными именованными свойствами. Назначение этих свойств работает, потому что массивы также являются объектами в JavaScript; но это не делает их ассоциативным массивом. На них лучше смотреть как хэши.

Методы массива, такие как concat, будут работать только с численно индексированными элементами массивов, а не со свойствами объектов - даже если эти объекты являются массивами.

1 голос
/ 20 августа 2009

JavaScript не имеет ассоциативных массивов, у него есть хеши объектов. Вы создаете массив и присваиваете значения некоторым его свойствам, а не самому массиву.

Ваш concat не будет работать, потому что значения являются свойствами объекта. Чтобы сделать так, как у вас есть, вам нужно объединить два объекта. YUI, jQuery и другие платформы JavaScript предоставляют полезные методы для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...