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() самый быстрый в хроме! Цитата:
|
Часовой пояс GMT +3, время: 11:52. |