JS:通过创建一种地图对对象数组进行排序

时间:2017-08-06 19:15:37

标签: javascript arrays reactjs dictionary meteor

我用

从mongoDB获取数据
Content.find({}).fetch()

所以有一个包含1000个文档的数组。每个文档都有一个category字段。

const data = [
    {
        title: 'Article 1',
        category: 'cars'
    },
    {
        title: 'Article 2',
        category: 'vegetables'
    }
]

现在我想显示一个列表,其中包含按类别组织的文档(获取每个类别的自己的列表)。 我认为我应该采取的最佳方式是制作地图。但我不知道该怎么做。

这就是我在做的事情:

首先,我已经对类别进行了硬编码(知道这是我能做的最糟糕的事情) 然后...

categories.map(category => {
    return (<List data={data.filter(d => d.category === category)} />)
}

有了这个,我将浏览30个类别并对我的数据进行30次filter。我认为在开头创建一种排序数据集会更聪明。

3 个答案:

答案 0 :(得分:1)

如果您更喜欢使用lodash,则可以使用sortBy

对数据集进行排序
_.sortBy(data, ['category', 'title']);
data.map(doc => ( console.log(doc); ));

这将按类别然后按标题对您的数据进行排序。 或者,如果您想根据类别使用groupBy将项目分成数组:

_.groupBy(data, 'category');
_.each(data, itemsByCategory => {
  return <List data={itemsByCategory} />;
});

答案 1 :(得分:0)

由于聚合mongodb上的数据不是一个选项,我会在客户端通过循环数据创建一个地图,如:

var titlesByCategory = {};
for (let value of data) {
 if (titlesByCategory[data.category]) {
   titlesByCategory[value.category].push(value.title);
 }
  else {
      titlesByCategory[value.category] = [value.title];
  }
}

然后,您可以使用类别作为键来访问给定类别的标题数组;例如titlesByCategory[vegetables]将返回蔬菜数组,您可以在其上进行循环/地图或任何您需要的操作。

答案 2 :(得分:0)

使用underscoreJS

_.groupBy(data, 'length');