Как изменить массив объектов для группировки за последний год? - PullRequest
0 голосов
/ 04 июля 2018

В настоящее время у меня есть массив объектов, таких как:

const array = [
  { key: 'model_1', year: 2019, displayOrder: 1},
  { key: 'model_1', year: 2018, displayOrder: 2},
  { key: 'model_2', year: 2018, displayOrder: 3},
  { key: 'model_3', year: 2018, displayOrder: 4},
  { key: 'model_4', year: 2019, displayOrder: 5},
  { key: 'model_5', year: 2018, displayOrder: 6},
];

Я пытаюсь сгенерировать новый массив, который группирует объекты по current и previous годам и порядки по displayOrder. Если бы мы применили это к вышеуказанному массиву, это выглядело бы так:

const array = {
  current: [
    { key: 'model_1', year: 2019, displayOrder: 1 },
    { key: 'model_2', year: 2018, displayOrder: 3 },
    { key: 'model_3', year: 2018, displayOrder: 4 },
    { key: 'model_4', year: 2019, displayOrder: 5 },
    { key: 'model_5', year: 2018, displayOrder: 6 },
  ],
  previous: [
    { key: 'model_1', year: 2018, displayOrder: 2 },
    { key: 'model_4', year: 2018, displayOrder: 7 },
  ],
};

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

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

const modelsByYear = array.reduce((acc, model) => {
  acc[model.year] = acc[model.year] || [];
  acc[model.year].push(model);
  return acc;
}, Object.create(null));

Каковы некоторые предложения о том, как я могу это сделать?

EDIT:

Мне нужна эта причина для фильтрации. Если я нажму current или previous, мне нужно увидеть соответствующие модели.

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Вы можете проверить ключ и соединить его с текущим массивом или нажать на массив previous.

const array = [{ key: 'model_1', year: 2019, displayOrder: 1 }, { key: 'model_1', year: 2018, displayOrder: 2 }, { key: 'model_2', year: 2018, displayOrder: 3 }, { key: 'model_3', year: 2018, displayOrder: 4 }, { key: 'model_4', year: 2019, displayOrder: 5 }, { key: 'model_5', year: 2018, displayOrder: 6 }, { key: 'model_4', year: 2018, displayOrder: 7 }],
    grouped = array.reduce((r, o) => {
        var index = r.current.findIndex(({ key }) => o.key === key);
        if (index !== -1) {
            if (r.current[index].year > o.year) {
                r.previous.push(o);
                return r;
            }
            r.previous.push(r.current.splice(index, 1)[0]);
        }
        r.current.push(o);
        return r;
    }, { current: [], previous: [] });

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 04 июля 2018

Учитывая, что в выводе есть опечатка, т.е.

{ key: 'model_5', year: 2018, displayOrder: 6 }

Должен присутствовать в текущем (согласно комментарию op). Вы можете попробовать следующее:

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

const array = [
  { key: 'model_1', year: 2019, displayOrder: 1},
  { key: 'model_1', year: 2018, displayOrder: 2},
  { key: 'model_2', year: 2018, displayOrder: 3},
  { key: 'model_3', year: 2018, displayOrder: 4},
  { key: 'model_4', year: 2019, displayOrder: 5},
  { key: 'model_5', year: 2018, displayOrder: 6},
];
array.sort((a,b)=> a.key.localeCompare(b.key) || b.year - a.year|| a.displayOrder - b.displayOrder);

var result = {
  "current" : [],
  "previous" : []
};

for(var i = 0; i < array.length; i++){
  if(i == 0 || result.current[result.current.length-1].key != array[i].key){
    result.current.push(array[i]);
  } else{
    result.previous.push(array[i]);
  }
}
console.log(result);
...