如何修改对象数组以按最近一年分组?

时间:2018-07-04 15:54:00

标签: javascript arrays ecmascript-6 javascript-objects

我目前有一个像这样的对象数组:

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},
];

我正在尝试生成一个新数组,该数组按currentprevious年对对象进行分组,并按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));

关于如何执行此操作有什么建议?

编辑:

我需要这样做的原因是为了进行过滤。如果单击currentprevious,则需要查看相应的模型。

2 个答案:

答案 0 :(得分:2)

您可以检查键并将其拼接到当前数组上,或压入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; }

答案 1 :(得分:0)

考虑到输出中有错字,即

{ 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);