Javascript:将对象数组过滤为两个

时间:2018-10-25 08:56:44

标签: javascript arrays sorting filter grouping

我的数组对象类似于下面的示例。

list = [
{'name': 'test1', 'email': 'test1@gmail.com', 'ispin': true, 'updatedAt': 1540456416646}
{'name': 'test2', 'email': 'test2@gmail.com', 'ispin': false, 'updatedAt': 1540456416111}
{'name': 'test3', 'email': 'test3@gmail.com', 'ispin': true, 'updatedAt': 1540456412541}
{'name': 'test4', 'email': 'test4@gmail.com', 'ispin': false, 'updatedAt': 1540456414521}
]

我能够像这样对这个数组对象进行排序。

return conversationList.sort((a, b) => {
  const firstTimestamp = a.lastMessage && a.lastMessage.createdAt ? a.lastMessage.createdAt : 0;
  const secondTimestamp = b.lastMessage && b.lastMessage.createdAt ? b.lastMessage.createdAt : 0;
  //Sort in DESC order
  return secondTimestamp - firstTimestamp;
});

使用上述代码,我可以按降序对对象数组进行排序。

现在,我的要求是首先基于 ispin键的过滤器数组。如果ispin设置为true,那么我还想使用键 pin 创建新的数组对象顺序和键 recent 降序排列的另一个数组。

所以我的最终输出应该是这样的。

{ 
  // first array object with key pin : filter by ispin:true and order by descending order
  pin: [
 {'name': 'test1', 'email': 'test1@gmail.com', 'ispin': true, 'updatedAt': 1540456416646}
 {'name': 'test3', 'email': 'test3@gmail.com', 'ispin': true, 'updatedAt': 1540456412541}
 ],
 // second array object with ket recent : order by descending order and records which has ispin false
 recent: [
 {'name': 'test2', 'email': 'test2@gmail.com', 'ispin': false, 'updatedAt': 1540456416111}
 {'name': 'test4', 'email': 'test4@gmail.com', 'ispin': false, 'updatedAt': 1540456414521}
 ]
}

1 个答案:

答案 0 :(得分:1)

要根据isPin值拆分列表,可以进行如下分组:

list = [
  {'name': 'test1', 'email': 'test1@gmail.com', 'ispin': true, 'updatedAt': 1540456416646},
  {'name': 'test2', 'email': 'test2@gmail.com', 'ispin': false, 'updatedAt': 1540456416111},
  {'name': 'test3', 'email': 'test3@gmail.com', 'ispin': true, 'updatedAt': 1540456412541},
  {'name': 'test4', 'email': 'test4@gmail.com', 'ispin': false, 'updatedAt': 1540456414521},
]

const groupBy = (array, fn) => array.reduce((result, item) => {
  const key = fn(item);
  if (!result[key]) result[key] = [];
  result[key].push(item);
  return result;
}, {});

const result = groupBy(list, x => x.ispin ? 'pin' : 'recent');
console.log(result);

(注意:groupBy受https://www.reddit.com/r/javascript/comments/4yi7e4/split_an_array_into_2_arrays_based_on_conditions/的启发),并且正如其作者所言,如果您使用此库,则可以使用lodash的groupBy