Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как удалить одинаковые элементы из массива (https://javascript.ru/forum/misc/14599-kak-udalit-odinakovye-ehlementy-iz-massiva.html)

Дмитрий_Кирсанов 22.01.2011 14:38

как удалить одинаковые элементы из массива
 
Файр-баг находит ошибку в строке if a[j]==a[i]{ - обозначена в коде, пишет что missing ( before condition, как избавиться от этой ошибки? Правильна ли логика вычислений?

<html>
<script>
var a= new Array(23);
a[0]=1;
a[1]=1;
a[2]=2;
a[3]=3;
a[4]=4;
a[5]=4;
a[6]=1;
a[7]=5;
a[8]=1;
a[9]=6;
a[10]=1;
a[11]=1;
a[12]=7;
a[13]=1;
a[14]=1;
a[15]=7;
a[16]=1;
a[17]=1;
a[18]=7;
a[19]=1;
a[20]=1;
a[21]=1;
a[22]=8;
aLength = a.length;
a.sort();
for (var i=0; i<=aLength; i++){
for (var j=1; j<=aLength; j++){
if a[j]==a[i]{ /*Вот та строка*/
a.splice(a[i]);
}
}
}
alert(a);
</script>
<html>

dmitriymar 22.01.2011 14:59

if( a[j]==a[i]){ /*Вот та строка*/

Дмитрий_Кирсанов 22.01.2011 15:11

dmitriymar, не понял вас

ksa 22.01.2011 15:24

Дмитрий_Кирсанов, посмотри синтаксис конструкции if
http://javascript.ru/if

Aetae 22.01.2011 15:24

>missing ( before condition
перевожу: отсутствует ( перед условием
Это как-бэ ничего вам не говорит?

рони 22.01.2011 15:32

Цитата:

Сообщение от Дмитрий_Кирсанов
aLength = a.length;

длина массива при выборке будет изменяться поэтому сохранять длину не смысла
На всякий случай рабочий пример )))
var a= new Array(23);
a[0]=1;
a[1]=1;
a[2]=2;
a[3]=3;
a[4]=4;
a[5]=4;
a[6]=1;
a[7]=5;
a[8]=1;
a[9]=6;
a[10]=1;
a[11]=1;
a[12]=7;
a[13]=1;
a[14]=1;
a[15]=7;
a[16]=1;
a[17]=1;
a[18]=7;
a[19]=1;
a[20]=1;
a[21]=1;
a[22]=8;
a.sort();
for (var i = 0; i < a.length; i++)
for (var j = i + 1; j < a.length;)
if (a[i] == a[j]) a.splice(j, 1);
else j++;
alert(a);

Zeroglif 22.01.2011 18:25

var a = [1,1,2,3,4,4,1,5,1,6,1,1,7,1,1,7,1,1,7,1,1,1,8],
    i = a.length;
a.sort();
while (i--) {
    if (a[i] == a[i-1]) {
        a.splice(i, 1);
    }
}

monolithed 22.01.2011 19:30

Цитата:

Сообщение от рони
На всякий случай рабочий пример

не тот случай, ПЦ наглухо зависает ))

Но есть, еще способ:

var array = [1, 2, 1, 1, 5, 3, 4, 4, 5], i = array.length, result = [];
array.sort();

while(i--){
    if(result.join('').search(array[i]) == '-1') {
        result.push(array[i]);
    }
}

alert(result);



upd: Zeroglif, тоже очень интересное решение!

e1f 22.01.2011 22:43

monolithed, а теперь думаем, что будет, если будут числа двузначные и далее :)

monolithed 22.01.2011 23:26

Цитата:

Сообщение от e1f
а теперь думаем

да уж, не доглядел:

var array = [1, 2, 1, 10, 5, 3, 4, 40, 50], i = array.length, result = [];

array.sort(function(a,b) {
    return b-a;
});

while(i--){
    if(result.join().search(array[i]+'\\b') == '-1') {
        result.push(array[i]);
    }
}

alert(result);

with-love-from-siberia 23.01.2011 01:41

все давно продумано: правильная версия 2 на дклабе

Array.prototype.union = function(list, callback)
{
        if ( 'function' != typeof callback ) {
                callback = function(value1, value2)
                {
                        return value1 != value2;
                }
        }

        var result = this;
        var L = result.length;
        var j;
        var u;
SEARCH_UNIQUE:
        for (var i = 0; i < list.length; i++) {
                j = 0;
                u = true;
                while ( j < L ) {
                        u = callback(result[j], list[i]);
                        if ( ! u ) {
                                continue SEARCH_UNIQUE;
                        }
                        j++;
                }
                result[L] = list[i];
                L++;
        }
        return result;
}

var arr1 = [1, 2, 3, 4];
var arr2 = [1, 4, 5, 6];
arr1.union(arr2);
alert(arr1);

var arr4 = [].union([1, 1, 3, 1, 4, 3, 5]);
alert(arr4);

monolithed 23.01.2011 10:47

Цитата:

Сообщение от with-love-from-siberia
все давно продумано: правильная версия 2 на дклабе

чем эта версия правельней последних двух предыдуших вариантов в частносте моей и Zeroglif'a?

рони 23.01.2011 14:25

На всякий случай
Цитата:

Сообщение от monolithed
reverse()

= return b-a;
var array = [1, 2, 1, 10, 5, 3, 4, 40, 50], i = array.length, result = [];

array.sort(function(a,b) {
*!*
    return b-a;
*/!*
});

while(i--){
    if(result.join().search(array[i]+'\\b') == '-1') {
        result.push(array[i]);
    }
}

alert(result);

x-yuri 24.01.2011 11:24

Цитата:

Сообщение от monolithed
чем эта версия правельней последних двух предыдуших вариантов в частносте моей и Zeroglif'a?

я думаю with-love-from-siberia не смог пройти мимо твоих попыток написать велосипед (ну ведь правда, твое решение и запутаннее, и медленнее версии Zeroglifa), но на деле получилось что-то вроде "что бы вы не делали с массивом, сохраняйте порядок элементов в нем, ибо!" или "на dklab'е уже все давным давно придумано, а вы тут..."

рони 24.01.2011 15:58

with-love-from-siberia,
Ваш пример не делает начальный массив массивом только с уникальными данными, если он изначально содержит неуникальные данные, можно конечно обьеднить с пустым массивом, для получения уникального.
Вариант получения массива с уникальными данными из нескольких массивов, при желании полученный результирующий массив можно затем отсортировать дополнительно.
Array.prototype.unique = function () {
    for (var d = arguments.length, a = 0; a < d; a++)
    for (var c = arguments[a], b = 0; b < c.length; b++) this.push(c[b]);
    for (a = 0; a < this.length; a++)
    for (b = a + 1; b < this.length;) if (this[a] === this[b]) this.splice(b, 1);
    else b++;
    return this
};

var arr1 = [4, 4, 1, 2, 3, 4, 1, 2, 3, 4];
var arr2 = [1, 4, 5, 6];
var arr3 = [7, 6, 5, 4];
arr1.unique(arr2,arr3);
alert(arr1);
.

with-love-from-siberia 24.01.2011 16:26

x-yuri,
Моя вина - неудачная фраза. Подразумевается сохранность порядка элементов в массиве.

рони,
Простите меня, но я не до конца понял Вас. Правильно ли я понял, что Вы имеете в виду код, например, подобный этому?

var arr1 = [4, 4, 1, 2, 3, 4, 1, 2, 3, 4];
arr1.unique();

monolithed 24.01.2011 16:31

x-yuri, я лишь хотел показать альтернативный (без slice'a) и менее громозкий вариант решения, относительно представленного ранее, а вариант Zeroglif'a безусловно могуч :)

рони 24.01.2011 18:38

with-love-from-siberia,
Да)))

FINoM 25.02.2011 04:49

monolithed, а Array.indexOf на что?

UPD
Это слегка запоздалое сообщение :)

msmsoft 21.07.2015 21:49

Вот еще один вариант:
var a = [1,1,2,3,4,4,1,5,1,6,1,1,7,1,1,7,1,1,7,1,1,1,8,0,9, 9,9,1];
var b = [];
a.sort();
console.log(a);
var i=0;
while (i < a.length) {
if (a[i] != a[i+1]) {
b.push(a[i]);
}
i++;
}
console.log(b);

рони 21.07.2015 22:18

Цитата:

Сообщение от msmsoft
Вот еще один вариант:

и чем ваш вариант отличается, от того что в 7 посте?

Vlasenko Fedor 22.07.2015 00:08

var arr = [1, 1, 2, 3, 4, 4, 1, 5, 1, 6, 1, 1, 7, 1, 1, 7, 1, 1, 7, 1, 1, 1, 8];
Array.prototype.uniq = function(){
    return this.filter(function (elem, pos, arr) {
        return arr.indexOf(elem) == pos;
    });
};
alert(arr.uniq());

Каждый по варианту и сложили домик :haha:


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