powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / (JavaScript) поделитесь опытом склеивания ассоциативных массивов
10 сообщений из 10, страница 1 из 1
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
    #35789573
NT Man
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно возник вопрос т.к. concat неработает см. код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Untitled</title>
<link rel="stylesheet" type="text/css" href="my.css">
<script language="javascript">
var arr = [];
arr['ooo'] = "Jani";
arr['ppp'] = "Tove";
arr['fff'] = "Hege";

var arr2 = [];
arr2['aaa'] = "John";
arr2['sss'] = "Andy";
arr2['ddd'] = "Wendy";

var arr3 = [];
arr3['fff'] = "Stale";
arr3['hhh'] = "Borge";

alert(arr.concat(arr2,arr3));

</script>
</head>
<body>
  
</body>
</html>
...
Рейтинг: 0 / 0
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
    #35789600
Фотография Frenzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в яваскрипте нет ассоциативных массивов. их роль выполняет Object.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js"></script>
<script type="text/javascript">

var arr = {};
arr['ooo'] = "Jani";
arr['ppp'] = "Tove";
arr['fff'] = "Hege";

var arr2 = {};
arr2['aaa'] = "John";
arr2['sss'] = "Andy";
arr2['ddd'] = "Wendy";

var arr3 = {};
arr3['fff'] = "Stale";
arr3['hhh'] = "Borge";

$.extend(arr, arr2, arr3);

</script>

_______________________________________
2pro4U
...
Рейтинг: 0 / 0
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
    #35789617
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frenzy,

сам-то понял, что сказал и сделал? - Попробуй запустить то, что написал :)

Для javascript "массив == ассоциативный массив", так что как ни назови - все правильно.
Просто использование функции concat немного неправильное в приведенном примере.
Из перевода:
"Метод concat объединяет массив и массив1 в новый массив и возвращает его. При этом все элементы массива массив1 добавляются в конец массива."
Соответственно, надо делать
Код: plaintext
arr = arr.concat(arr2.concat(arr3)); //получится arr + arr2 + arr3
...
Рейтинг: 0 / 0
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
    #35789664
Фотография illion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruck,

собственно, встречный вопрос и предложение: сам-то понял, что сказал и сделал? - Попробуй запустить то, что написал :)

ассоциативный массив != массив. Ассоциативный массив == объект. В изначальном примере создается три пустых массива с некими свойствами 'ooo','ppp',... Соответственно и concat, склеив три пустых массива, вернет пустой массив, т.к. на свойства объекта власть конката не распространяется.
...
Рейтинг: 0 / 0
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
    #35789682
Фотография Frenzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruckFrenzy,

сам-то понял, что сказал и сделал? - Попробуй запустить то, что написал :)

Для javascript "массив == ассоциативный массив", так что как ни назови - все правильно.
Просто использование функции concat немного неправильное в приведенном примере.
Из перевода:
"Метод concat объединяет массив и массив1 в новый массив и возвращает его. При этом все элементы массива массив1 добавляются в конец массива."
Соответственно, надо делать
Код: plaintext
arr = arr.concat(arr2.concat(arr3)); //получится arr + arr2 + arr3


я то пробую запускать - мой пример работает.
а вот вы не пробуете - попробуйте сделайте такой конкат, а потом обратитесь к какому-нибудь новому ключу - удивитесь, получив "undefined".

"массив" в яваскрипте не может выступать в роли "ассоциативного массива". единственная причина, по которой присваивание типа arr['asd'] = 'asd'; проходит без ошибки - это то, что массив в яваскрипте - тоже объект. но на такие ключи ни concat, ни for...in работать не будут. а вот объект ведёт себя именно как "ассоциативный массив" или "хэш" из других языков.

так что читайте документацию и не ставьте себя в глупое положение
...
Рейтинг: 0 / 0
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
    #35789683
Фотография Frenzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
долго писал, собсно illion уже всё это сказала

_______________________________________
2pro4U
...
Рейтинг: 0 / 0
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
    #35789729
NT Man
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Frenzy, illion - спасибо.

Вот что у меня в итоге получилось:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Untitled</title>

<script language="javascript">
function merge_array(arr)
{
    for (var i =  1 ; i < arguments.length; i++)
        for (id in arguments[i]) arr[id] = arguments[i][id];
    return arr;
}

var arr = {};
arr['ooo'] = "Jani";
arr['ppp'] = "Tove";
arr['fff'] = "Hege";

var arr2 = {};
arr2['aaa'] = "John";
arr2['sss'] = "Andy";
arr2['ddd'] = "Wendy";

var arr3 = {};
arr3['fff'] = "Stale";
arr3['hhh'] = "Borge";

var arr4 = merge_array(arr, arr2, arr3); 
for (id in arr4) 
{
    document.write(id + '=' +arr4[id]+'<br>');
}
</script>
</head>
<body>
  
</body>
</html>

Как мой вариант в плане производительности? Нелюблю я всякие фреймворки тупеешь с ними :)
...
Рейтинг: 0 / 0
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
    #35789892
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frenzy, мои глубокие извинения ... не то и не с тем смешал. Погорячился.

NT Man,
все нормально, для более оптимального варианта в плане производительности можно кое-что поменять (правда, видно будет только при больших массивах):
Код: plaintext
1.
2.
3.
4.
5.
6.
function merge_array() {
    var result = [];
    for (var i =  0 , arrs; arrs = arguments[i]; i++) //эта конструкция наиболее быстрая
        for (var j =  0 , arr; arr = arrs[j]; j++)
            result.push(arr);
    return result;
}
...
Рейтинг: 0 / 0
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
    #35804253
NT Man
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IDVsbruck , не то у тебя получилось, ты делаешь простой массив, теряя при этом все ключи.
Вот мой более правильный м рабочий вариант.
Код: plaintext
1.
2.
3.
4.
5.
6.
function array_merge()
{    
     var res = {};
     for (var i =  0 ; i < arguments.length; i++)
         for (id in arguments[i]) if (typeof(arguments[i][id])=='object') res[id]=array_merge(res[id], arguments[i][id]); else res[id]=arguments[i][id];
     return res;
 }
Но глядя на него становиться непосебе ведь он ресурсоемкий, есть оптимальнее решение?
...
Рейтинг: 0 / 0
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
    #35804838
NT Man
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В вышенаписанном коде малюсенькая бага, которую сразу не заметишь.
Модератор: согласно просьбе - исправлено
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / (JavaScript) поделитесь опытом склеивания ассоциативных массивов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]