19.02.2014, 07:42
|
|
Аспирант
|
|
Регистрация: 29.12.2011
Сообщений: 67
|
|
Удаление одинаковых элементов массива
Помогите удалить одинаковые элементы массива, оставляя те что не повторялись
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);
Т.е. если значение повторялось, его не пишем вообще
[2, 10, 5, 3, 4, 40, 50]
|
|
19.02.2014, 12:45
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,133
|
|
Ваяс,
var array = [1, 2, 1, 10, 5, 3, 4, 40, 50],
i = array.length,
result = [];
array.sort(function (a, b) {
return a - b;
});
for (var i = 0; i < array.length; i++) {
array[i] != array[i - 1] && array[i + 1] != array[i] && result.push(array[i])
}
alert(result);
|
|
19.02.2014, 15:55
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
var arr = [1, 2, 1, 10, 5, 3, 4, 40, 50],
bound = '\n\n===@@@==\n\n',
tststr = bound + arr.join(bound+bound) + bound,
out=[];
for (var i = 0; i < arr.length; i++) {
if(tststr.split(bound +arr[i] + bound).length <3)out.push(arr[i])
}
alert(out)
Последний раз редактировалось Deff, 19.02.2014 в 16:07.
|
|
19.02.2014, 16:06
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от Deff
|
bound = '\n\n==123==\n\n'
|
Вместо этих ужасных костылей лучше es5-shim.js подключить (или выковырять только функцию Array.prototype.indexOf)
__________________
В личку только с интересными предложениями
|
|
19.02.2014, 16:23
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
danik.js,
У меня до сих пор на сервисе требование Ие7
1. Костыль не длиннее
2. Если разобрать исходники, всё в конце концов делается через строчные операторы, т.е по идее скорость обработки должна возрастать
3. Для данного случая можно bound = ','
|
|
19.02.2014, 16:57
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от Deff
|
У меня до сих пор на сервисе требование Ие7
|
es5-shim.js работает даже в IE5.5 если ты не в курсе. Так что не знаю к чему твой довод
1) Не длинее, но ужаснее, плюс имеет ограниченную применимость, в отличие от [].indexOf
2) Ха-ха, будешь мне тут за скорость говорить, когда у тебя на каждой итерации идет создание массива через split()
3) Вот именно. К чему было бороду лепить.
__________________
В личку только с интересными предложениями
|
|
19.02.2014, 18:29
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от danik.js
|
1) Не длинее, но ужаснее,
|
Имхо: А что твоё мнение определяющее во всём инете ?
Мне например Ван Гог не импонирует...
Цитата:
|
плюс имеет ограниченную применимость, в отличие от [].indexOf
|
Приведи пример, второе: Вы слишком серьёзно подходите к кодам выложенным в качестве развлечения!
Сообщение от danik.js
|
2) Ха-ха, будешь мне тут за скорость говорить, когда у тебя на каждой итерации идет создание массива через split()
|
Выложи свой код, создадим тест сравнения, для текстовых переменных как то тестировал, (ксать не оптимизировал пока по скорости
Последний раз редактировалось Deff, 19.02.2014 в 18:41.
|
|
19.02.2014, 20:05
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от Deff
|
Выложи свой код
|
var array = [1, 2, 1, 10, 5, 3, 4, 40, 50];
var result = [];
for (var i = 0; i < array.length; i++) {
var item = array[i];
if (array.indexOf(item, i + 1) === -1 && (i === 0 || array.lastIndexOf(item, i - 1) === -1))
result.push(item);
}
alert(result);
__________________
В личку только с интересными предложениями
|
|
19.02.2014, 20:10
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от Deff
|
создадим тест сравнения
|
Ну что ж, давай!
/**
* @author danik.js
**/
function test1() {
var array = [1, 2, 1, 10, 5, 3, 4, 40, 50];
var result = [];
for (var i = 0; i < array.length; i++) {
var item = array[i];
if (array.indexOf(item, i + 1) === -1 && (i === 0 || array.lastIndexOf(item, i - 1) === -1))
result.push(item);
}
return result;
}
/**
* @author Deff
**/
function test2() {
var array = [1, 2, 1, 10, 5, 3, 4, 40, 50];
var bound = ',';
var tststr = bound + array.join(bound+bound) + bound;
var result = [];
for (var i = 0; i < array.length; i++) {
var item = array[i];
var t = bound +item + bound;
if (tststr.indexOf(t) === tststr.lastIndexOf(t))
result.push(item);
}
return result;
}
/**
* @author рони
**/
function test3() {
var array = [1, 2, 1, 10, 5, 3, 4, 40, 50];
var result = [];
array.sort(function (a, b) {
return a - b;
});
for (var i = 0; i < array.length; i++) {
var item = array[i];
if (item != array[i - 1] && array[i + 1] != item)
result.push(item);
}
return result;
}
/**
* @author Дзен-трансгуманист (danik.js edition)
**/
function test4(){
var array = [1, 2, 1, 10, 5, 3, 4, 40, 50];
var uniqueness = [];
var result = [];
for (var i = 0; i < array.length; i++) {
var item = array[i];
switch (uniqueness[item]) {
case undefined:
uniqueness[item] = true;
break;
case true:
uniqueness[item] = false;
}
}
for (var i = 0; i < array.length; i++) {
var item = array[i];
if (uniqueness[item])
result.push(item);
}
return result;
}
/**
* @author BallsShaped
**/
function test6(){
var array = [1, 2, 1, 10, 5, 3, 4, 40, 50];
var result = [];
for (var i = 0; i < array.length; i++) {
var item = array[i];
if (array.indexOf(item) == array.lastIndexOf(item))
result.push(item);
}
return result;
}
/**
* @author Дзен-трансгуманист
**/
function test5(){
var array = [1, 2, 1, 10, 5, 3, 4, 40, 50];
var uniqueness = new Map();
var result = [];
for ( var i = 0; i < array.length; i++ ) {
var value = array[ i ];
switch ( uniqueness.get( value )) {
case undefined: uniqueness.set( value, true ); return;
case true: uniqueness.set( value, false );
}
}
for ( var i = 0; i < array.length; i++ ) {
var item = array[ i ];
if ( uniqueness.get( value ) )
result.push( item );
}
return result;
}
console.time('danik.js');
for (var i = 0; i < 1000000; i++)
test1();
console.timeEnd('danik.js')
console.time('Deff');
for (var i = 0; i < 1000000; i++)
test2();
console.timeEnd('Deff')
console.time('рони');
for (var i = 0; i < 1000000; i++)
test3();
console.timeEnd('рони')
console.time('Дзен-трансгуманист (danik.js edition)');
for (var i = 0; i < 1000000; i++)
test4();
console.timeEnd('Дзен-трансгуманист (danik.js edition)')
console.time('BallsShaped');
for (var i = 0; i < 1000000; i++)
test6();
console.timeEnd('BallsShaped')
console.time('Дзен-трансгуманист');
for (var i = 0; i < 1000000; i++)
test5();
console.timeEnd('Дзен-трансгуманист')
Мои результаты в хроме:
Код:
|
danik.js: 725.000ms
Deff: 5175.000ms
рони: 1448.000ms |
Хорошо бы конечно генерить рандомные массивы разного размера, но как-то лень мне...
Думаю на больших массивах вариант рони окажется быстрей.
__________________
В личку только с интересными предложениями
Последний раз редактировалось danik.js, 19.02.2014 в 23:42.
|
|
19.02.2014, 20:19
|
Профессор
|
|
Регистрация: 14.09.2012
Сообщений: 162
|
|
То ли я задачу не понял, то ли это конкурс самого нечитаемого кода. Не проще ли так:
.filter(function (item, index, array) {
return array.indexOf(item) == index;
})
|
|
|
|