Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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_Sorting - Fatal编程技术网

Javascript 如何根据其他标签数组对带有标签的对象数组进行排序?

Javascript 如何根据其他标签数组对带有标签的对象数组进行排序?,javascript,sorting,Javascript,Sorting,例如,我想对带有标签的对象数组进行排序 var arrayToBeSorted = [{label: 'firstLabel', value: 123}, {label: 'secondLabel', value: 456}, {label: 'thirdLabel', value: 789}] var labels = ['secondLabel', 'thirdLabel', 'fourthLabel', 'firstLabel'] 例如,一组标签作为基线 var arrayToBeSo

例如,我想对带有标签的对象数组进行排序

var arrayToBeSorted = [{label: 'firstLabel', value: 123}, {label: 'secondLabel', value: 456}, {label: 'thirdLabel', value: 789}]
var labels = ['secondLabel', 'thirdLabel', 'fourthLabel', 'firstLabel']
例如,一组标签作为基线

var arrayToBeSorted = [{label: 'firstLabel', value: 123}, {label: 'secondLabel', value: 456}, {label: 'thirdLabel', value: 789}]
var labels = ['secondLabel', 'thirdLabel', 'fourthLabel', 'firstLabel']
现在我想对第一个数组进行排序,以便其中的对象遵循第二个数组中标签的顺序
labels

我知道定制比较器的基本排序机制,比如

CustomComparator: function(a, b) {
  if (a[0].length > b[0].length) return -1;
  if (a[0].length < b[0].length) return 1;
  return 0;
}
CustomComparator:函数(a、b){
如果(a[0].length>b[0].length)返回-1;
if(a[0].length
但我不知道如何转换这个

在我的研究中,我找到了用ruby编码的stackoverflow解决方案,但我不知道javascript中是否有类似的选项


我非常感谢您的帮助,为此投入了大量时间。

您需要提供每秒数组值的优先级。这里,我们从第二个数组名作为键和索引作为优先级构建一个映射。因此,您可以使用
映射
默认值
排序

var arraytobested=[{label:'firstLabel',value:123},{label:'secondLabel',value:456},{label:'thirdLabel',value:789}]
变量标签=['secondLabel'、'thirdLabel'、'fourthLabel'、'firstLabel']
让mapper=newmap(labels.Map((v,i)=>[v,i+1]))
让final=arrayToBeSorted.sort((a,b)=>{
返回(mapper.get(a.label)| |无穷)-(mapper.get(b.label)| |无穷)
})

console.log(最终版)
有两种方法:

  • 使用
    indexOf
    重复搜索
    标签
    数组

  • 使用地图可以更快地查找标签的索引

  • 下面是一个使用
    indexOf
    (在ES2015+中)的示例:

    实时复制:

    var arraytobested=[{label:'firstLabel',value:123},{label:'secondLabel',value:456},{label:'thirdLabel',value:789}];
    变量标签=['secondLabel'、'thirdLabel'、'fourthLabel'、'firstLabel'];
    排序((a,b)=>labels.indexOf(a.label)-labels.indexOf(b.label));
    
    控制台日志(arrayToBeSorted)您可以创建自定义订单,并通过它创建订单:

    var arraytobsorted=[
    {label:'firstLabel',值:123},
    {label:'secondLabel',值:456},
    {label:'thirdLabel',值:789}
    ];
    设顺序={secondLabel:1,thirdLabel:2,fourthLabel:3,firstLabel:4};
    排序((a,b)=>{
    退货订单[a.label]-订单[b.label];
    });
    控制台日志(arrayToBeSorted)直接使用

    const sortArray=require('sort-array'))
    常量数组排序=[
    {label:'firstLabel',值:123},
    {label:'secondLabel',值:456},
    {label:'thirdLabel',值:789}
    ]
    索塔雷(Arraytobsorted{
    作者:'标签',
    订单:“labelOrder”,
    海关订单:{
    标签顺序:['secondLabel','thirdLabel','fourthLabel','firstLabel']
    }
    })
    console.log(arrayToBeSorted)
    
    打印此输出:

    [
      { label: 'secondLabel', value: 456 },
      { label: 'thirdLabel', value: 789 },
      { label: 'firstLabel', value: 123 }
    ]
    

    尼娜指出了我回答中的一个选项的问题,我刚才已经解决了这个问题。因为你已经接受了我的答案,所以打电话给你让你知道,所以如果你使用了那个选项…:-)@第二种方法中的NinaScholz-Gah,-1是个坏主意,™ 谢谢首先,你使用什么价值并不重要。我的意思是要写一张便条,说明违约的情况。我将修复-1问题并添加注释,谢谢。