Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 过滤、映射、排序和concat_Javascript_Sorting_Filter_Concat - Fatal编程技术网

Javascript 过滤、映射、排序和concat

Javascript 过滤、映射、排序和concat,javascript,sorting,filter,concat,Javascript,Sorting,Filter,Concat,我觉得可能有更好的解决方案,因为我在下面的例程(映射和排序)中重复了代码 它是具有已读(1或null)和未读状态(0)的任意邮件列表。我在顶部显示未读消息,在底部显示已读消息,并应用了一些排序和映射,最后将两个结果连接起来 var unread = data.filter(function(item){ return item.Read == 0; }).map(function(item){ return {Id: item.Id, First: item.First.toLo

我觉得可能有更好的解决方案,因为我在下面的例程(映射和排序)中重复了代码

它是具有已读(1或null)和未读状态(0)的任意邮件列表。我在顶部显示未读消息,在底部显示已读消息,并应用了一些排序和映射,最后将两个结果连接起来

var unread = data.filter(function(item){
    return item.Read == 0;
}).map(function(item){
    return {Id: item.Id, First: item.First.toLowerCase(), Last: item.Last.toLowerCase()}
}).sort(function(a, b){
    if (a.Last < b.Last) return -1;
    if (a.Last > b.Last) return 1;
    return 0;
});

var read = data.filter(function(item){
    return item.Read == null || item.Read == 1;
}).map(function(item){ // lowercase (first, last) and sort the list by last
    return {Id: item.Id, First: item.First.toLowerCase(), Last: item.Last.toLowerCase()}
}).sort(function(a, b){
    if (a.Last < b.Last) return -1;
    if (a.Last > b.Last) return 1;
    return 0;
});

var finalData = unread.concat(read);

只需将您的
映射
排序
函数移动到它们自己的命名函数中并重用它们:

// helpers
function processItem(item) {
    return {Id: item.Id, First: item.First.toLowerCase(), Last: item.Last.toLowerCase()}
}

function sortItemByLast(a, b) {
    if (a.Last < b.Last) return -1;
    if (a.Last > b.Last) return 1;
    return 0;
};

// process data
var unread = data.filter(function(item){
    return item.Read == 0;
}).map(processItem).sort(sortItemByLast);

var read = data.filter(function(item){
    return item.Read == null || item.Read == 1;
}).map(processItem).sort(sortItemByLast);


var finalData = unread.concat(read);
//助手
函数processItem(项目){
返回{Id:item.Id,First:item.First.toLowerCase(),Last:item.Last.toLowerCase()}
}
函数sortItemByLast(a,b){
如果(a.Lastb.Last)返回1;
返回0;
};
//过程数据
var unread=data.filter(函数(项){
返回项。读取==0;
}).map(processItem).sort(sortItemByLast);
var read=data.filter(函数(项){
return item.Read==null | | item.Read==1;
}).map(processItem).sort(sortItemByLast);
var finalData=未读。concat(已读);

您可以先
排序
,然后使用
减少
来累积结果:

var数据=[
{Id:1,第一个:“约翰”,最后一个:“B”,读作:0},
{Id:1,第一个:“Jane”,最后一个:“C”,读作:0},
{Id:1,第一个:“Doe”,最后一个:“D”,读作:1},
{Id:1,第一个:“Alpha”,最后一个:“B”,读作:1}
];
var result=data.sort(函数(a,b){
如果(a.Lastb.Last)返回1;
返回0;
}).reduce(函数(res,o){
var newO={Id:o.Id,First:o.First.toLowerCase(),Last:o.Last.toLowerCase()};//要推送到已读或未读数组的对象(如果您没有使用旧对象o,那么只需从中删除属性“read”,并使用它而不创建新对象)
res[o.Read==0?“未读”:“Read”].push(newO);//根据属性“Read”将o推送到已读或未读数组中
返回res;
},{已读:[],未读:[]};//初始值将是一个包含两个数组的对象(一个用于读取,一个用于未读取对象)

控制台日志(结果)似乎您只想在多个字段上排序。要先按读取状态排序,然后按姓氏排序,然后按姓氏排序(忽略大小写),您可以:

var数据=[
{Id:1,第一个:“约翰”,最后一个:“B”,读作:0},
{Id:1,第一个:“Jane”,最后一个:“C”,读作:0},
{Id:1,第一个:“Doe”,最后一个:“D”,读作:1},
{Id:1,第一个:“Alpha”,最后一个:“B”,读作:1}
];
数据排序((a,b)=>
b、 读
?b.阅读-a.阅读
:a.Last.toLowerCase().localeCompare(b.Last.toLowerCase())
?a.Last.toLowerCase().localeCompare(b.Last.toLowerCase())
:a.First.toLowerCase().localeCompare(b.First.toLowerCase());

控制台日志(数据)向您的问题添加输入和预期输出。使用一些数据编辑。如果您可以删除标签(已读/未读),请参阅我的输出。可能吗?谢谢,请看我的答案improvements@Devyiweid没那么难。对象包含两个数组。查看新编辑。@KikoGarcia为什么?@Devyiweid抱歉!我误解了<代码>读取
属性已删除。阅读评论以获得更多改进,因为我认为没有必要创建新对象。它是根据读取状态(concat)进行排序和分组的,请参阅我的答案以获得想法或任何改进。未读邮件位于顶部(按姓氏字母顺序排列),其余邮件位于底部(也按字母顺序排列)@Devyiweid无需分组、筛选或连接。你可以把一切都当作是一种。我的输出与您的预期输出相匹配。感谢Robby的洞察力,它本质上是一种排序,我对添加到输入中的
Read:null
记录有点问题,请再次建议。@Devyiweid更新了我的答案。
// helpers
function processItem(item) {
    return {Id: item.Id, First: item.First.toLowerCase(), Last: item.Last.toLowerCase()}
}

function sortItemByLast(a, b) {
    if (a.Last < b.Last) return -1;
    if (a.Last > b.Last) return 1;
    return 0;
};

// process data
var unread = data.filter(function(item){
    return item.Read == 0;
}).map(processItem).sort(sortItemByLast);

var read = data.filter(function(item){
    return item.Read == null || item.Read == 1;
}).map(processItem).sort(sortItemByLast);


var finalData = unread.concat(read);