Сортировка массива Javascript и уникальный - PullRequest
49 голосов
/ 29 января 2011

У меня есть массив JavaScript, подобный этому:

var myData=['237','124','255','124','366','255'];

Мне нужно, чтобы элементы массива были уникальными и отсортированными:

myData[0]='124';
myData[1]='237';
myData[2]='255';
myData[3]='366';

Несмотря на то, что члены массива выглядяткак целые числа , они не являются целыми числами , поскольку каждый из них уже преобразован в строку:

var myData[0]=num.toString();
//...and so on.

Есть ли способ выполнить все эти задачи в JavaScript?

Ответы [ 17 ]

0 голосов
/ 17 июня 2016

Вот простая строка с O(N), при условии:

  • вы находитесь в современном браузере или в node.js
  • ваш массив - строки

Тогда

> Object.keys([{}].concat(['a', 'b', 'a']).reduce((l,r) => l[r] = l ))
[ 'a', 'b' ]

Пояснение

Исходный набор данных, предположим, что он поступает из внешней функции

let data = ['a', 'b', 'a']

Мыхотим добавить объект к началу массива

let setup = [{}].concat(data)

Далее мы хотим уменьшить массив до единого значения.

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

let reduced = setup.reduce((l,r) => l[r] = l)

Мы устанавливаем l[r] = l, потому что в javascript значение выражения присваивания возвращается, когда оператор присваивания используется в качестве выражения.

Далее мы хотим получить ключи этого объекта

let keys = Object.keys(setup)

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

['a', 'b']
0 голосов
/ 29 января 2011
// Another way, that does not rearrange the original Array 
// and spends a little less time handling duplicates.

function uniqueSort(arr, sortby){
    var A1= arr.slice();
    A1= typeof sortby== 'function'? A1.sort(sortby): A1.sort();

    var last= A1.shift(), next, A2= [last];
    while(A1.length){
        next= A1.shift();
        while(next=== last) next= A1.shift();
        if(next!=undefined){
            A2[A2.length]= next;
            last= next;
        }
    }
    return A2;
}
var myData= ['237','124','255','124','366','255','100','1000'];
uniqueSort(myData,function(a,b){return a-b})

// the ordinary sort() returns the same array as the number sort here,
// but some strings of digits do not sort so nicely numerical.
0 голосов
/ 29 января 2011

Полагаю, я выложу этот ответ для некоторого разнообразия.Этот метод очистки дубликатов - это то, что я выбрал для проекта во Flash, над которым я сейчас работаю около месяца назад.

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

var nums = [1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10];
var newNums = purgeArray(nums);

function purgeArray(ar)
{
    var obj = {};
    var temp = [];
    for(var i=0;i<ar.length;i++)
    {
        obj[ar[i]] = ar[i];
    }
    for (var item in obj)
    {
        temp.push(obj[item]);
    }
    return temp;
}

Уже есть 5 других ответов, поэтому я не вижу необходимости размещать функцию сортировки.

0 голосов
/ 06 сентября 2018

O [N ^ 2] решения плохие, особенно когда данные уже отсортированы, нет необходимости делать два вложенных цикла для удаления дубликатов.Один цикл и сравнение с предыдущим элементом будет работать отлично.

Простого решения с помощью O [] для sort () будет достаточно.Мое решение:

function sortUnique(arr, compareFunction) {
  let sorted = arr.sort(compareFunction);
  let result = sorted.filter(compareFunction
    ? function(val, i, a) { return (i == 0 || compareFunction(a[i-1], val) != 0); }
    : function(val, i, a) { return (i == 0 || a[i-1] !== val); }
  );
  return result;
}

Кстати, можно сделать что-то подобное, чтобы иметь метод Array.sortUnique ():

Array.prototype.sortUnique = function(compareFunction) {return sortUnique(this, compareFunction); }

Кроме того, sort () можно изменить, чтобы удалить второй элементФункция if () возвращает 0 (равные элементы), хотя этот код может запутаться (необходимо пересмотреть границы цикла в полете).Кроме того, я держусь подальше от создания собственных функций sort () на интерпретируемых языках, так как это наверняка ухудшит производительность.Так что это дополнение для рассмотрения ECMA 2019+.

0 голосов
/ 15 декабря 2012

function sort () только хорошо, только если ваш номер имеет ту же цифру, например:

var myData = ["3","11","1","2"]

вернется;

var myData = ["1","11","2","3"]

и здесь улучшениедля функции из mrmonkington

myData.sort().sort(function(a,b){return a - b;}).filter(function(el,i,a){if(i==a.indexOf(el) & el.length>0)return 1;return 0;})

вышеупомянутая функция также удалит пустой массив, и вы можете проверить демонстрацию ниже

http://jsbin.com/ahojip/2/edit
0 голосов
/ 08 марта 2019

Самый быстрый и простой способ выполнить эту задачу.

const N = Math.pow(8, 8)
let data = Array.from({length:  N}, () => Math.floor(Math.random() * N))
let newData = {}
let len = data.length

// the magic
while (len--) {
    newData[data[len]] = true
}
0 голосов
/ 29 января 2011

Боюсь, вы не можете объединить эти функции, т.е. ты должен сделать что-то вроде этого: -

myData.unique().sort();

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

Надеюсь, это поможет.

Список литературы: -

Array.sort

Array.unique

...