Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   удаляем одинаковые значения с массива (https://javascript.ru/forum/misc/37147-udalyaem-odinakovye-znacheniya-s-massiva.html)

qwermjk 09.04.2013 14:11

удаляем одинаковые значения с массива
 
Вот моя вторая функция которую я здесь выношу на обозрение!! С прошлой вы мне очень помогли, чтобы её усовершенствовать =)
Может быть будут идеи по этой функции:
Убирает одинаковые значения в массиве (я это применял для шахматного сайта, когда собирал номера битых полей!)
function array_unique(array){
	for(f=0; f<array.length; f++){
		for(u=array.length-1; u>f; u--){
			if(array[u] == array[f]) array.splice(u, 1);
		}
	}
}

array55 = [3,7,1,8,3,8,5,4,4,2,1,3,6,6];
alert(array55);
array_unique(array55);
alert(array55);

danik.js 09.04.2013 14:23

http://stackoverflow.com/questions/1...es-in-an-array

Akalenik 09.04.2013 14:23

array55 = [3,7,1,8,3,8,5,4,4,2,1,3,6,6];
uniqueArray = array55.filter(function(elem, pos) {
            return array55.indexOf(elem) == pos;
        });


так проще

danik.js 09.04.2013 14:36

Цитата:

Сообщение от Akalenik
так проще

Ага. Особенно когда начнешь тестировать кроссбраузерность :))

Akalenik 09.04.2013 14:42

Цитата:

Сообщение от danik.js
Ага. Особенно когда начнешь тестировать кроссбраузерность

А в чем тут могут быть проблемы с кроссбразерностью? Разбираюсь пока очень слабо, так что интересно сразу знать на какие грабли еще придется наступить :)

danik.js 09.04.2013 15:16

Цитата:

Сообщение от Akalenik
А в чем тут могут быть проблемы с кроссбразерностью?

Отсутствие поддержки в IE8.
http://kangax.github.io/es5-compat-t...ototype.filter

Akalenik 09.04.2013 15:22

А! Всего-то, а я уж думал что там что-то серьезное. Но спасибо за объяснение.

qwermjk 09.04.2013 15:48

Цитата:

Сообщение от Akalenik
1array55 = [3,7,1,8,3,8,5,4,4,2,1,3,6,6];2uniqueArray = array55.filter(function(elem, pos) {3            return array55.indexOf(elem) == pos;4        });

так проще

У меня в опере не работает это! (Версия:12.14 Сборка:1738)

devote 09.04.2013 16:05

Цитата:

Сообщение от qwermjk
У меня в опере не работает это! (Версия:12.14 Сборка:1738)

все нормально работает:
array55 = [3,7,1,8,3,8,5,4,4,2,1,3,6,6];
uniqueArray = array55.filter(function(elem, pos) {
            return array55.indexOf(elem) == pos;
        });
alert(uniqueArray);

qwermjk 09.04.2013 16:16

Цитата:

Сообщение от devote
alert(uniqueArray);

Терь работает, не то выводил!!

qwermjk 09.04.2013 16:18

Мне кажется что по интерациям, быстрее мой способ!

devote 09.04.2013 16:46

Цитата:

Сообщение от qwermjk
Мне кажется что по интерациям, быстрее мой способ!

огромные массивы оба способа долго будут мучить.
самый быстрый вариант, это складывать уникальные значения в другой массив, тем самым не нужно будет пробегать по огромному массиву проверяя в нем же, его же значения.

nerv_ 09.04.2013 18:08

Цитата:

Сообщение от devote
самый быстрый вариант, это складывать уникальные значения в другой массив

а не в объект?

Aetae 09.04.2013 22:08

Цитата:

Сообщение от nerv_ (Сообщение 245121)
а не в объект?

Поясни.
Если как значения - то перебор хэша медленней, если как ключи - то мы говори не только о текстовых значениях.

nerv_ 10.04.2013 11:46

Цитата:

Сообщение от Aetae
Поясни.

Задача - уникальные в массиве.

var obj = {};
var newArr = [];

// цикл по массиву (arr)
// value

if ( !obj[ value ] ) {
    obj[ value ] = 1;
    newArr.push( value );
}

Aetae 10.04.2013 12:02

nerv_,
а теперь дочитай пост.)

P.S. Сам в своё время попался на эту "гениальную" идею.)

devote 10.04.2013 12:04

nerv_,
Aetae же упомянул что мы говорим не только о текстовых/примитивных значениях. Объекты так же могут быть в массиве, которые ты уже не сможешь поместить в объект в качестве ключа.
var arr = [document, document, window, document.body];

nerv_ 10.04.2013 12:29

Цитата:

Сообщение от Aetae
а теперь дочитай пост.)

:)

Цитата:

Сообщение от devote
var arr = [document, document, window, document.body];

конкретно на данный пример, можно сделать так
alert([
    document.toString(),
    document.toString(),
    window.toString(),
    document.body.toString()
]);


Ну а в целом: примитивы в объект, объекты в массив. Быстрее будет. Или нет? )

devote 10.04.2013 12:33

Цитата:

Сообщение от nerv_
конкретно на данный пример, можно сделать так

не надо придираться к написанному... Понятно дело что у этих объектов разные значения toString() но в простых объектах все иначе:
var a = {};
var b = {};
var arr = [a, a, b, b];

nerv_ 10.04.2013 14:48

Цитата:

Сообщение от Aetae
Сам в своё время попался на эту "гениальную" идею.)

вообще-то идея нормальная и вовсе не гениальная ) скорее стандартная )

Обычно, мы знаем с чем имеем дело. И, если надо из массива примитивов отобрать уникальные, вариант с объектом предпочтительней.

С другой стороны, с точки зрения абстрактной функции array_unique, ей должно быть все равно.

SV0L0CH 13.04.2013 22:07

function unique(array){
  var set = new Set;
  var res = [];
  for(var i = 1; i<array.length; i++)
    if(!set.has(array[i])){
      res.push(array[i]);
      set.add(array[i]);
    }
  return res;
}

Современный способ.

Aetae 14.04.2013 02:04

SV0L0CH, только фф.

SV0L0CH 14.04.2013 05:35

Aetae, в хроме тоже можно включить.


Часовой пояс GMT +3, время: 08:45.