Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / (JavaScript) поделитесь опытом склеивания ассоциативных массивов / 10 сообщений из 10, страница 1 из 1
31.01.2009, 14:40
    #35789573
NT Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
Собственно возник вопрос т.к. 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
31.01.2009, 15:25
    #35789600
Frenzy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
в яваскрипте нет ассоциативных массивов. их роль выполняет 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
31.01.2009, 15:40
    #35789617
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
Frenzy,

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

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

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

ассоциативный массив != массив. Ассоциативный массив == объект. В изначальном примере создается три пустых массива с некими свойствами 'ooo','ppp',... Соответственно и concat, склеив три пустых массива, вернет пустой массив, т.к. на свойства объекта власть конката не распространяется.
...
Рейтинг: 0 / 0
31.01.2009, 17:16
    #35789682
Frenzy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
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
31.01.2009, 17:17
    #35789683
Frenzy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
долго писал, собсно illion уже всё это сказала

_______________________________________
2pro4U
...
Рейтинг: 0 / 0
31.01.2009, 18:27
    #35789729
NT Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
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
31.01.2009, 23:00
    #35789892
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
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
08.02.2009, 15:46
    #35804253
NT Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
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
09.02.2009, 08:22
    #35804838
NT Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) поделитесь опытом склеивания ассоциативных массивов
В вышенаписанном коде малюсенькая бага, которую сразу не заметишь.
Модератор: согласно просьбе - исправлено
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / (JavaScript) поделитесь опытом склеивания ассоциативных массивов / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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