按匹配的对象字段数排序对象数组

时间:2015-09-23 17:39:03

标签: javascript arrays json sorting object

我有以下对象:

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"]中包含rugbyfootball的任何对象都应该先在数组中返回,然后下一个只包含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()以查看匹配的项目数量。这可能吗?我无法在网上找到我尝试做的任何示例,而且我不知道从哪里开始。

3 个答案:

答案 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;
&#13;
&#13;

针对小型数据集优化的解决方案,无需临时存储计数。

&#13;
&#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;
&#13;
&#13;

答案 2 :(得分:0)

使用自定义排序功能可以检查tagstestArray中存在的项目数。这样的事情应该有效:

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;
});