Удаление одинаковых элементов массива
Помогите удалить одинаковые элементы массива, оставляя те что не повторялись
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] |
Ваяс,
:-?
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);
|
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)
|
Цитата:
|
danik.js,
:) У меня до сих пор на сервисе требование Ие7 1. Костыль не длиннее 2. Если разобрать исходники, всё в конце концов делается через строчные операторы, т.е по идее скорость обработки должна возрастать 3. Для данного случая можно bound = ',' |
Цитата:
1) Не длинее, но ужаснее, плюс имеет ограниченную применимость, в отличие от [].indexOf 2) Ха-ха, будешь мне тут за скорость говорить, когда у тебя на каждой итерации идет создание массива через split() 3) Вот именно. К чему было бороду лепить. |
Цитата:
Мне например Ван Гог не импонирует... Цитата:
Цитата:
|
Цитата:
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);
|
Цитата:
/**
* @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Думаю на больших массивах вариант рони окажется быстрей. |
То ли я задачу не понял, то ли это конкурс самого нечитаемого кода. Не проще ли так:
.filter(function (item, index, array) {
return array.indexOf(item) == index;
})
|
BallsShaped, не правильно ты понял. Если элемент имеет дубль - то ни он, ни его дубль не попадает в результат. В результат попадают только уникальные элементы.
|
рони, не вижу своего варианта :D
|
И сделай bound запятую. И вобще, я же уже вычистил код и привел единому виду. Лучше сделай генерацию рэндомных массивов.
|
EcmaScript 6 Map
function uniquesOnly ( source ) {
var uniqueness = new Map();
source.forEach( function ( value ) {
switch ( uniqueness.get( value )) {
case undefined: uniqueness.set( value, true ); return;
case true: uniqueness.set( value, false );
}
});
return source.filter( function ( value ) {
return uniqueness.get( value );
});
}
alert(uniquesOnly([1, 2, 1, 10, 5, 3, 4, 40, 50]));
|
:write: убрал сравнение копипаст был неудачным )))
|
Ну че, запилете мою функцию в тесты? ))))
|
Дзен-трансгуманист, интересный вариант :victory:
Думаю в случае с числовым/строчным массивом уместен упрощенный вариант:
var array = [1, 2, 1, 10, 5, 3, 4, 40, 50];
var uniqueness = {};
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;
}
}
var result = array.filter(function (value) {
return uniqueness[value];
});
alert(result);
|
:) обычно я делал так ...
var time_roni = new Date
for (var a=0; a<10000; a++) {
var array = [1, 2, 1, 10, 5, 3, 4, 40, 50],
tmp = {},
result = [];
for (var i=0; i<array.length; i++) {tmp[array[i]] = tmp[array[i]]?++tmp[array[i]]:1}
for (var i = 0; i < array.length; i++) {
tmp[array[i]] == 1 && result.push(array[i])
}
}
var time_roni = (new Date).getTime() - time_roni.getTime() ;
function uniquesOnly ( source ) {
var uniqueness = new Map();
source.forEach( function ( value ) {
switch ( uniqueness.get( value )) {
case undefined: uniqueness.set( value, true ); return;
case true: uniqueness.set( value, false );
}
});
return source.filter( function ( value ) {
return uniqueness.get( value );
});
}
var time_dzen = new Date
for (var a=0; a<10000; a++) {
uniquesOnly([1, 2, 1, 10, 5, 3, 4, 40, 50]);
}
var time_dzen = (new Date).getTime() - time_dzen.getTime() ;
var time_danik = new Date
for (var a=0; a<10000; a++) {
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);
}
}
var time_danik = (new Date).getTime() - time_danik.getTime() ;
alert([time_roni,time_dzen,time_danik])
|
.filter(function (item, index, array) {
return array.indexOf(item) == array.lastIndexOf(item);
})
|
BallsShaped, ловко )
Обновил тесты. Не заметил что код рони модифицирует исходный массив. Добавил вариант шарика, переписал циклы на простой for(). Вариант с Map() самый быстрый в хроме! Цитата:
|
var arr = [],
arrLng = 6000,
out=[];
for (var i = 0; i < arrLng; i++) {
arr.push(parseInt(Math.random()*arrLng))
}
//====== Deff =========
var st = +new Date(),
bound = ',';
out=[];
var tststr = bound + arr.join(bound+bound) + bound;
for (var i = 0; i < arr.length; i++) {
var t = bound +arr[i] + bound;
if(tststr.indexOf(t)==tststr.lastIndexOf(t))out.push(arr[i])
}
var work = +new Date()-st;
alert('Deff ='+work+'\n\n'+out)
//===== danik ==========
var st = +new Date();
out=[];
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
if (arr.indexOf(item, i + 1) === -1 && (i === 0 || arr.lastIndexOf(item, i - 1) === -1))
out.push(item);
}
var work = +new Date()-st;
alert('danik ='+work+'\n\n'+out)
//===== рони ==========
var st = +new Date();
out=[];
arr.sort(function (a, b) {
return a - b;
});
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
if (item != arr[i - 1] && arr[i + 1] != item)
out.push(item);
}
var work = +new Date()-st;
alert('рони ='+work+'\n\n'+out)
В Опере 12.6 и Ие быстрее первая метода, в Хроме и Мозилле - вторая |
Deff, обновил твой вариант у себя в тесте. Все-равно твой код самый медленный.
|
Цитата:
Ну да ладно, из-за академического интереса ради, разве что. |
Цитата:
А в опере да, быстрей, но там разница в считанные проценты. Вобще, опера тормозит жутко. |
Походу в WEBkit работа с массивами уже переведена на аппаратный уровень
|
Цитата:
И чот твой тест (пост 9) у меня из топика не запускается ================================================ И вообще, по сравнению с рони, мы все в жопе.. (правдо меняется порядок элементов, хотя наверно и при восстановлении старого порядка следования всё одно выиграет |
Цитата:
Цитата:
А вообще, прикольно видеть, когда на такую, казалось бы, простую задачку возникает целая куча решений. Коллективный мозговой штурм - это и для ума полезно, и для души приятно. :) |
Гы, нашел , где лажа ![]() |
Deff, с какой это стати не учитываешь время на создание строки?
|
Цитата:
теперь походу в в WEBkit работа с массивами уже переведена на аппаратный уровень В опере 12.6 и сейчас чуть быстрее danik.js |
Цитата:
|
Дзен-трансгуманист,
Ну я имею ввиду чо ранее был интерпретатор, в сейчас для функций массивов уже скомпилированный код |
Цитата:
То есть какие отличия {0:'a'}[0] от ['a'][0] ? Преобразование нуля в строку идет в обоих случаях? |
Кстати, почему-то в хроме доступ к свойствам, если явно использовать строки в качестве ключей, медленней раз в десять..
(function(){
var o = {0:'a', 1: 'b'};
console.time('t2');
for (var j = 0; j < 100000000; j++) {
o['0'];
o['1'];
}
console.timeEnd('t2');
})();
(function(){
var o = {0:'a', 1: 'b'};
console.time('t');
for (var j = 0; j < 100000000; j++) {
o[0];
o[1];
}
console.timeEnd('t');
})();
|
Cваял версию 2
var arr = [],
arrLng = 6000,
out=[];
for (var i = 0; i < arrLng; i++) {
arr.push(parseInt(Math.random()*arrLng))
}
//====== Deff =========
var st = +new Date(),
bound = ',';
out=[];
var tststr = bound + arr.join(bound) + bound;
for (var i = 0; i < arr.length; i++) {
var t = bound +arr[i] + bound;
if(tststr.indexOf(t)==tststr.lastIndexOf(t))out.push(arr[i])
}
var work = +new Date()-st;
alert('Deff ='+work+'\n\n'+out)
//====== Deff v2 =========
var st = +new Date(),
obj ={};
out=[];
for (var i = 0; i < arr.length; i++) {
if(obj[arr[i]]){obj[arr[i]]='D'} //Дубль
else obj[arr[i]] = i;
}
for (var key in obj) {
if(obj[key]!='D') out[obj[key]] = key
}
out = out.join(',').replace(/^,+/,'').replace(/,+$/,'').split(/,+/)
var work = +new Date()-st;
alert('Deff v2 ='+work+'\n\n'+out)
//===== danik ==========
var st = +new Date();
out=[];
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
if (arr.indexOf(item, i + 1) === -1 && (i === 0 || arr.lastIndexOf(item, i - 1) === -1))
out.push(item);
}
var work = +new Date()-st;
alert('danik ='+work+'\n\n'+out)
//===== рони ==========
var st = +new Date();
out=[];
arr.sort(function (a, b) {
return a - b;
});
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
if (item != arr[i - 1] && arr[i + 1] != item)
out.push(item);
}
var work = +new Date()-st;
alert('рони ='+work+'\n\n'+out)
|
Цитата:
Цитата:
|
Цитата:
Но многих операций в теории можно избежать с помощью всяких эвристических оптимизаций. Например, движок может не определять у массива свойство length, если анализ семантического дерева показывает, что оно ни разу не используется. А может не то что не определять никаких свойств, а даже и вообще не создавать "JS-объект" как таковой: если известно, что аксессоры используют только ключи целочисленного типа, то достаточно выделить голый индексированный список с простой интеграцией ссылок в инфраструктуру сборщика мусора. Накладные расходы будут близки к минимальным. |
Цитата:
Отбросил медленные варианты:
(function(){
var array = [],
arrayLength = 6000;
for (var i = 0; i < arrayLength; i++) {
array.push(parseInt(Math.random()*arrayLength));
}
/**
* @author рони
**/
function test1() {
var result = [];
var clone = array.slice();
clone.sort(function (a, b) {
return a - b;
});
for (var i = 0; i < clone.length; i++) {
var item = clone[i];
if (item != clone[i - 1] && clone[i + 1] != item)
result.push(item);
}
return result;
}
/**
* @author Deff
**/
function test2() {
var obj ={};
var result = [];
for (var i = 0; i < array.length; i++) {
if(obj[array[i]]){
delete obj[array[i]];
continue;
}
obj[array[i]] = i;
}
for (var key in obj) {
result[obj[key]] = key;
}
result = result.join(',').replace(/^,+/,'').replace(/,+$/,'').split(/,+/);
return result;
}
/**
* @author Дзен-трансгуманист (danik.js edition)
**/
function test3(){
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 Дзен-трансгуманист
**/
function test4(){
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 ); break;
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('рони');
for (var i = 0; i < 100; i++)
test1();
console.timeEnd('рони')
console.time('Deff');
for (var i = 0; i < 100; i++)
test2();
console.timeEnd('Deff')
console.time('Дзен-трансгуманист (danik.js edition)');
for (var i = 0; i < 100; i++)
test3();
console.timeEnd('Дзен-трансгуманист (danik.js edition)')
console.time('Дзен-трансгуманист');
for (var i = 0; i < 100; i++)
test4();
console.timeEnd('Дзен-трансгуманист')
})();
В хроме вариант с Map() на большом массиве медленней чем с []. В файрфоксе наоборот... |
|
Deff, консоль открой. От тебя не ожидал )))
Чтоб отработал вариант с Map() надо в chrome://flags включить harmony В фф не знаю, у меня работает. Обнови фф или покопайся в настройках. |
| Часовой пояс GMT +3, время: 05:09. |