Как вернуть новый массив массивов словарей после сортировки по значению словаря - PullRequest
0 голосов
/ 30 апреля 2019

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

Итак, у меня есть следующее:

let foo = [{"id": "hello123"}, {"id":"goodbye123"}, {"id":"hello123"}];

Я хотел бы отсортировать его по значению idи вернуть массив словаря массива примерно так:

let bar = sortByKey(foo, "id");
console.log(bar);

output = [[{"id":"hello123"},{"id":"hello123"}],[{"id":"goodbye123"}]]

Пока все, что я знаю, как это сделать, это отсортировать его так, чтобы результат выглядел следующим образом:

[{"id":"hello123"},{"id":"hello123"},{"id":"goodbye123"}]

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Вы можете использовать хеш-таблицу для групп и Array#reduce для итерации массива и назначения всех объектов их группам.

Позже вернет все значения из хеш-таблицы.

function groupBy(array, group) {
    return Object.values(array.reduce((hash, o) => {
        hash[o[group]] = hash[o[group]] || [];
        hash[o[group]].push(o);
        return hash;
    }, Object.create(null)));
}

var data =  [{ id: "hello123" }, { id: "goodbye123" }, { id: "hello123" }];
	
console.log(groupBy(data, "id"));
.as-console-wrapper { max-height: 100% !important; top: 0; }

То же самое с Map и чуть короче.

function groupBy(array, group) {
    return Array.from(array
        .reduce((m, o) => m.set(o[group], [...(m.get(o[group]) || []), o]), new Map)
        .values()
    );
}

var data =  [{ id: "hello123" }, { id: "goodbye123" }, { id: "hello123" }];
	
console.log(groupBy(data, "id"));
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 30 апреля 2019

Просто ради другого решения (несмотря на то, что решение @ NinaScholz намного лучше), вот решение, основанное на Set, map и filter:

let foo = [{"id": "hello123"}, {"id":"goodbye123"}, {"id":"hello123"}];

function sortByKey(arr, key) {
	const _uniqueValues = [...new Set(foo.map(i => i[key]))].sort((a,b) => (a[key] > b[key]) ? 1 : ((b[key] > a[key]) ? -1 : 0));
  return _uniqueValues.map(v => arr.filter(i => i[key] === v));
}

console.log(sortByKey(foo, 'id'));

Сначала будут приняты уникальные значения (с использованием Set) и отсортированы, затем сопоставлены их путем разделения исходного массива с помощью filter.Решение reduce будет более эффективным, но это все еще возможный способ сделать это.

Пожалуйста, примите / прочитайте приведенное ниже решение @ NinaScholz, это всего лишь альтернатива предоставленному решению.Использование Reduce - правильный подход

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...