Javascript 按匹配的对象字段数对对象数组排序
我的目标如下:Javascript 按匹配的对象字段数对对象数组排序,javascript,arrays,json,sorting,object,Javascript,Arrays,Json,Sorting,Object,我的目标如下: var entries = [ { fields: { tags: [ { fields: { id: "football" } }, { fields: { id: "running" } }, { fields: { id: "tennis" } } ] } }, { fields: { tags: [ { fields: { id: "te
var entries = [
{
fields: {
tags: [
{ fields: { id: "football" } },
{ fields: { id: "running" } },
{ fields: { id: "tennis" } }
]
}
},
{
fields: {
tags: [
{ fields: { id: "tennis" } },
{ fields: { id: "football" } },
{ fields: { id: "rugby" } }
]
}
},
{
fields: {
tags: [
{ fields: { id: "cricket" } },
{ fields: { id: "running" } }
]
}
},
{
fields: {
tags: [
{ fields: { id: "football" } },
{ fields: { id: "rugby" } }
]
}
}
];
现在,我想使用另一个数组对数组进行排序:var testArray=[“football”,“rugby”]
因此,在其字段.tags.fields.id
中同时包含橄榄球
和足球
的任何对象都应首先在数组中返回,然后才显示仅包含1的任何对象。所以我想要的结果是:
var sortedEntries = [
{
fields: {
tags: [
{ fields: { id: "tennis" } },
{ fields: { id: "football" } },
{ fields: { id: "rugby" } }
]
}
},
{
fields: {
tags: [
{ fields: { id: "football" } },
{ fields: { id: "rugby" } }
]
}
},
{
fields: {
tags: [
{ fields: { id: "football" } },
{ fields: { id: "running" } },
{ fields: { id: "tennis" } }
]
}
},
{
fields: {
tags: [
{ fields: { id: "cricket" } },
{ fields: { id: "running" } }
]
}
}
];
我认为使用
sort()
函数可以实现这一点,但后来我意识到我需要比较testArray
以查看有多少项是匹配的。这可能吗?我在网上找不到任何我想做的事情的例子,也不知道从哪里开始。可以使用自定义排序功能来检查标签中有多少项存在于测试阵列中。像这样的方法应该会奏效:
var testArray = ["football", "rugby"];
entries.sort(function(a, b) {
var a_score = 0;
var b_score = 0;
for (var i=0; i<a.fields.tags.length; i++) {
if (testArray.indexOf(a.fields.tags[i]) > -1) {
a_score++;
}
}
for (var i=0; i<b.fields.tags.length; i++) {
if (testArray.indexOf(b.fields.tags[i]) > -1) {
b_score++;
}
}
return b_score-a_score;
});
var testArray=[“足球”、“橄榄球”];
条目.排序(函数(a,b){
var a_得分=0;
var b_得分=0;
对于(变量i=0;i-1){
a_分数++;
}
}
对于(变量i=0;i-1){
b_分数++;
}
}
返回b_分数-a_分数;
});
自定义排序功能,用于过滤标签数组并检查匹配项的长度
entries.sort(function (a, b) {
var aMatches = a.fields.tags.filter(function (item) {
return testArray.indexOf(item.fields.id) > -1
});
var bMatches = b.fields.tags.filter(function (item) {
return testArray.indexOf(item.fields.id) > -1
});
return bMatches.length - aMatches.length;
});
解决方案针对大型数据集进行了优化,具有临时存储计数功能
var search=['football'、'rugby'],
条目=[{fields:{tags:[{{fields:{id:{cricket}}},{fields:{id:{running}]},{fields:{tags:{{fields:{id:{football}}},{fields:{id:{running}},{fields:{id:{networking}}}}},{fields:{tags:{fields:{tags:{fields:{id:{football:{football},},{id:{running},},{[{fields:{id:“football”},{fields:{id:“rugby”}}]},
sortedData=entries.map(函数(a){
a、 count=a.fields.tags.reduce(函数(r,b){return r+!!~search.indexOf(b.fields.id);},0);
返回a;
},[]).sort(函数(a,b){return b.count-a.count;}).map(函数(a){
删除a.count;
返回a;
}, []);
document.write(“”+JSON.stringify(sortedData,0,4)+“”)
Gah,上次你问我时我回答了这个问题,但在我有机会完成撰写之前你就把它删除了!别担心,我在下面重新编码了。你需要返回那些包含搜索词的对象并对其进行排序。@Coop看起来其他一些对象正在过滤不匹配的内容,而我没有。不确定期望是什么对于thoseI来说,我认为在每次比较中重新计算匹配可能会有点问题。@Yoshi point,会在大数据集上陷入困境。有趣的是,这似乎工作得很好。我唯一担心的是它不太可读(这一级别的javascript有点超出我的能力)。这不适用于较小的数据集吗?它适用于任何大小的数据集,但对于较小的数据集,可能会有一个较短的版本。我想这取决于大数据集和小数据集之间的界限。我处理的数据将使这些对象膨胀,并且会有各种其他内容,e中可能有多达30或40个主要对象ntries array.30或40很小,只需使用真实数据集进行尝试。我认为这必须窃取已被接受的答案。简短而甜美,有两个良好且有效的选项。