Группировка по сложному массиву - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть такой массив:

scripts
    [
      ["scriptNameA", "dateAsString1", number],
      ["scriptNameB", "dateAsString1", number],
      ["scriptNameC", "dateAsString2", number],
      ["scriptNameD", "dateAsString3", number],
      ["scriptNameE", "dateAsString3", number]
    ]

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

scriptsGroupedByDate[
    "dateAsString1"[
        ["scriptNameA", "dateAsString1", number],
        ["scriptNameB", "dateAsString1", number]
    ],
    "dateAsString2"[
        ["scriptNameC", "dateAsString2", number]
    ],
    "dateAsString3"[
        ["scriptNameD", "dateAsString3", number],
        ["scriptNameE", "dateAsString3", number]
    ]
]

, есть ли способ сделатьэтот ?спасибо

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

let number = 0;

let scripts =
    [
        ["scriptNameA", "dateAsString1", number],
        ["scriptNameB", "dateAsString1", number],
        ["scriptNameC", "dateAsString2", number],
        ["scriptNameD", "dateAsString3", number],
        ["scriptNameE", "dateAsString3", number]
    ];

var result = scripts.reduce((a, b) => (a[b[1]] ? a[b[1]].push(b) : a[b[1]] = [b], a), {});

console.log(result);
0 голосов
/ 27 февраля 2019

@ gkelly и другие: Tnx за эти замечательные ответы.У меня было время, чтобы понять весь этот синтаксис.Вот тот же ответ, так что вы можете шаг за шагом отлаживать его и посмотреть, как он работает.Извините, что опубликовал это как ответ, но я не знаю, как форматировать код в комментариях.

let number = 0;
let scripts =
    [
        ["scriptNameA", "dateAsString1", number],
        ["scriptNameB", "dateAsString1", number],
        ["scriptNameC", "dateAsString2", number],
        ["scriptNameD", "dateAsString3", number],
        ["scriptNameE", "dateAsString3", number]
    ];


var func = function(accum, arrayitem) {
    debugger;

    //arrayitem is one of the five items in the scripts array. It is itself an array.
    //The 2nd item (zero based index) is the groupby value
    var groupByVal = arrayitem[1];

    //the accumulator is first an empty object (second parameter to reduce function)
    if(accum[groupByVal]){
        accum[groupByVal].push(arrayitem);
    }
    else {
        accum[groupByVal] = [arrayitem];
    }
    return accum;
};

var result = scripts.reduce(func, {});
console.log(result);
0 голосов
/ 26 февраля 2019

Легко, используя уменьшить

let number = 0;
let scripts = [
  ['scriptNameA', 'dateAsString1', number],
  ['scriptNameB', 'dateAsString1', number],
  ['scriptNameC', 'dateAsString2', number],
  ['scriptNameD', 'dateAsString3', number],
  ['scriptNameE', 'dateAsString3', number]
];

const res = scripts.reduce((a, b) => a.set(b[1], (a.get(b[1]) || []).concat(b)),new Map);
console.log(res) // open the console, SO's console output can't Map;

Вы можете легко преобразовать получившуюся Карту в любую структуру, которую вы предпочитаете.

...