我在 NodeJS 中有这个函数,我可以在其中过滤元素:
// Remove duplicates and expired
var data = (result[0].concat(result[1]).concat(result[3])).filter((event, index, self) => self.findIndex((t) => {
var eventDate = new Date(event.start_time);
return t.id === event.id && todayDate.setHours(0,0,0,0) <= eventDate.setHours(0,0,0,0);
}) === index)
// Remove invalid
.filter(function(event){
if(~this.indexOf(event.id)){
return false;
} else {
return true;
}
}, result[2])
// Sort array by date
.sort(function(a,b) {
return new Date(a.start_time).getTime() - new Date(b.start_time).getTime();
})
// Filter promoted
// PROBLEM
.filter(function(event){
if(~this.indexOf(event.id)){
event.promoted = true;
console.log(filtered.indexOf(event));
// MOVE THIS TO TOP
}
return true;
}, result[4]);
现在,在最后一个过滤器方法中,我从 lis(result [4]) 中查找具有 ID 的元素,并向它们添加属性“promoted”。
我还想将所有提升的事件立即移至数组顶部,因为我在数组中拥有它们的索引,而不是为此作业触发另一个循环。
我该怎么做?因为对我来说使用 splice 不起作用
对此功能的质量还有什么建议吗?
谢谢:)
最佳答案
您不应使用filter
来更改数组的元素。有map
可以做到这一点。
如果您想根据多个属性对元素进行排序,您可以这样做。
//clean
const invalid = result[2],
promoted = result[4];
var data = result[0]
.concat(result[1], result[3])
.filter(dedup) //remove duplicated
//set promoted flag
.map(event => {
event.promoted = promoted.indexOf(event.id) > -1
return event
})
//sort by promoted then by start_time
.sort((a, b) => (b.promoted - a.promoted) || (a.start_time - b.start_time))
关于javascript - 将元素数组位置更改为顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37522082/