我有以下对象:
debugger
现在,我想使用另一个数组对数组进行排序: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"]
中包含rugby
和football
的任何对象都应该先在数组中返回,然后下一个只包含1的任何对象。所以我之后的结果将是:
fields.tags.fields.id
我认为使用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()
以查看匹配的项目数量。这可能吗?我无法在网上找到我尝试做的任何示例,而且我不知道从哪里开始。
答案 0 :(得分:1)
自定义排序功能,用于过滤标签数组并检查这些匹配的长度
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;
});
的 DEMO 强>
答案 1 :(得分:1)
针对大型数据集优化的解决方案,临时存储计数。
var search = ['football', 'rugby'],
entries = [{ fields: { tags: [{ fields: { id: "cricket" } }, { fields: { id: "running" } }] } }, { 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: "football" } }, { fields: { id: "rugby" } }] } }],
sortedData = entries.map(function (a) {
a.count = a.fields.tags.reduce(function (r, b) { return r + !!~search.indexOf(b.fields.id); }, 0);
return a;
}, []).sort(function (a, b) { return b.count - a.count; }).map(function (a) {
delete a.count;
return a;
}, []);
document.write('<pre>' + JSON.stringify(sortedData, 0, 4) + '</pre>');
&#13;
针对小型数据集优化的解决方案,无需临时存储计数。
var search = ['football', 'rugby'],
entries = [{ fields: { tags: [{ fields: { id: "cricket" } }, { fields: { id: "running" } }] } }, { 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: "football" } }, { fields: { id: "rugby" } }] } }],
sortedData = entries.sort(function (a, b) {
function f(r, c) { return r + !!~search.indexOf(c.fields.id); }
return b.fields.tags.reduce(f, 0) - a.fields.tags.reduce(f, 0);
});
document.write('<pre>' + JSON.stringify(sortedData, 0, 4) + '</pre>');
&#13;
答案 2 :(得分:0)
使用自定义排序功能可以检查tags
中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;
});