我的数组对象类似于下面的示例。
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}
]
}
答案 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
。