Многомерный массив неизвестного размера в JavaScript - PullRequest
0 голосов
/ 25 ноября 2018

Действительно изо всех сил пытаюсь разобраться в этом ... Я пытаюсь отсортировать элементы из массива в другой массив, но по категориям.Мой код в настоящее время работает, но проблема в том, что мне нужно знать размер массива «sort».На данный момент существует четыре записи, которые работают с «данными».Первые два data.cat сравниваются с n, а их идентификаторы помещаются в sort [0].Когда два не совпадают, 1 добавляется к c.Затем код повторяется, снова помещая новые совпадения в sort [1] и т. Д., И т. Д.

var data = [
            {"cat": 0, "id":"AAAA"},
            {"cat": 0, "id":"BBBB"},
            {"cat": 1, "id":"CCCC"},
            {"cat": 1, "id":"DDDD"},
            {"cat": 1, "id":"EEEE"},
            {"cat": 1, "id":"FFFF"}, //pseudodata
            {"cat": 1, "id":"GGGG"},
            {"cat": 2, "id":"HHHH"},
            {"cat": 2, "id":"IIII"},
            {"cat": 2, "id":"JJJJ"},
            {"cat": 3, "id":"KKKK"}
        ];

var sort = [[], [], [], [],]

function sortDates(){
    var n = 0;
    for (var i = 0; i < data.length; i++){      
        if (data[i].cat == n){
            console.log("Category " + n +" entry: " + data[i].id);
            sort[n].push(data[i].id);
        } else {
            console.log("Entry " + data[i].id + " does not match. Moving to next category...");
            n++;
            i--; 
        }
    }
}

Все это работает нормально, но если я добавлю больше в массив данных (например, {"cat": 4," id ":" LLLL "}), программа завершается с ошибкой" sort [n] не является функцией ".Это потому, что в массиве sort есть только четыре доступных элемента.

Так что мне просто интересно, есть ли способ обойти это?Если массив данных постоянно меняет размер и добавляется больше записей / категорий, нужно ли мне вручную изменять размер массива сортировки?

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Другим способом, которым вы можете добиться этого с помощью ES6 в более сжатой форме, является использование Array.reduce и внутри Array.sort через String.localeCompare:

var data = [{ "cat": 0, "id": "BBBB" }, { "cat": 0, "id": "AAAA" }, { "cat": 1, "id": "CCCC" }, { "cat": 1, "id": "DDDD" }, { "cat": 1, "id": "EEEE" }, { "cat": 1, "id": "FFFF" }, { "cat": 1, "id": "GGGG" }, { "cat": 2, "id": "HHHH" }, { "cat": 2, "id": "IIII" }, { "cat": 2, "id": "JJJJ" }, { "cat": 3, "id": "KKKK" } ]

const result = Object.values(data.reduce((r,c) => {
  r[c.cat] = [...r[c.cat] || [], c.id].sort((a,b) => a.localeCompare(b))
  return r
}, {}))
console.log(result)

String.localeCompare имеет различные варианты с точки зрения сравнения (например, работа с числами в строках, чувствительность к регистру и т. Д.)

Идея состоит в том, чтобыиспользуйте Array.reduce, чтобы сгруппировать записи в объекте, а затем просто используйте Object.values, чтобы получить желаемый результат (многомерный массив).

0 голосов
/ 25 ноября 2018

Вы можете использовать проверку по умолчанию для массива с логическим ИЛИ || и назначить пустой массив, если элемент не установлен.

sort[n] = sort[n] || [];
sort[n].push(data[i].id);

Кстати, вы могли быиспользуйте cat напрямую, без итерации массива sort для получения правильного индекса.

function sortDates() {
    var i, sort = [];
    for (i = 0; i < data.length; i++) {
        sort[data[i].cat] = sort[data[i].cat] || [];
        sort[data[i].cat].push(data[i].id);
    }
    return sort;
}

var data = [{ cat: 0, id: "AAAA" }, { cat: 0, id: "BBBB" }, { cat: 1, id: "CCCC" }, { cat: 1, id: "DDDD" }, { cat: 1, id: "EEEE" }, { cat: 1, id: "FFFF" }, { cat: 1, id: "GGGG" }, { cat: 2, id: "HHHH" }, { cat: 2, id: "IIII" }, { cat: 2, id: "JJJJ" }, { cat: 3, id: "KKKK" }],
    result = sortDates(data);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...