Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.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 按匹配的对象字段数对对象数组排序_Javascript_Arrays_Json_Sorting_Object - Fatal编程技术网

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很小,只需使用真实数据集进行尝试。我认为这必须窃取已被接受的答案。简短而甜美,有两个良好且有效的选项。