Javascript 通过嵌套数组和传递的键匹配进行复杂的json排序

Javascript 通过嵌套数组和传递的键匹配进行复杂的json排序,javascript,json,Javascript,Json,我需要对一个相对复杂的json对象进行排序 简化版本如下所示 未分类 我需要根据匹配的ID及其相关位置对该数组进行排序。。。例如,如果我传入ID为2,我希望排序顺序如下,因为“title 2”的ID匹配位置为0,而“title 1”的ID匹配位置为1 按2的id匹配排序 我认为函数可能需要这样的外观,但我无法确定如何最好地构造和排序这些数据 const unsortedArray = //[json that needs to be sorted] function sortArray(par

我需要对一个相对复杂的json对象进行排序

简化版本如下所示

未分类 我需要根据匹配的ID及其相关位置对该数组进行排序。。。例如,如果我传入ID为2,我希望排序顺序如下,因为“title 2”的ID匹配位置为0,而“title 1”的ID匹配位置为1

按2的id匹配排序 我认为函数可能需要这样的外观,但我无法确定如何最好地构造和排序这些数据

const unsortedArray = //[json that needs to be sorted]

function sortArray(parentArray, sortArray, match){
  for(i in parentArray.sortArray){
   if(parentArray.sortArray[i].id == match){
    //use this position to sort by
   }
  }
}

sortArray(unsortedArray,order,1);

这是一个有点代码高尔夫,但让我看看是否可以解释

你想使用这个方法。您给它一个回调,它接受两个参数:要比较的元素

愚蠢的部分正在元素中挖掘以找到位置。这就是发生这种情况的地方
a.order.find(a=>a.id==id).position
。获取第一个元素并获得order属性,该属性恰好是一个ID数组。用于获取id与排序依据的id匹配的对象。当你得到那个对象时(比如
{id:2,position:0}
你就得到了位置。在第二个元素中进行同样的挖掘以找到正确的位置

现在,您将有两个整数进行比较,以告诉排序函数这两个整数中哪一个先到。Array.sort()要求返回值小于零、等于零或大于零。因此,您可以从另一个位置减去一个位置,然后只返回结果

希望这有点道理

const数据=[
{
标题:“标题2”,
订单:[
{
id:2,
职位:0
},
{
id:1,
职位:1
}
]
},
{
标题:“标题1”,
订单:[
{
id:1,
职位:0
},
{
id:2,
职位:1
}
]
}
];
常量排序=(数据,id)=>
data.sort(
(a,b)=>
a、 order.find(a=>a.id==id).position-
b、 order.find(a=>a.id==id).position
);

log(sort(data,2))
这是一段代码,但让我们看看是否可以解释一下

您希望使用该方法。您给它一个回调,该回调包含两个参数:要比较的元素

goofy部分正在元素中挖掘以找到位置。这就是发生这种情况的地方
a.order.find(a=>a.id==id).position
。获取第一个元素并获取order属性,该属性恰好是一个id数组。用于获取id与排序依据的id匹配的对象。获取该对象时(如
{id:2,position:0}
你得到了位置。在第二个元素中进行同样的挖掘以找到正确的位置

现在,您将有两个整数进行比较,以告诉排序函数这两个整数中哪一个先到。Array.sort()要求返回值小于零、等于零或大于零。因此,您可以从另一个位置减去一个位置,然后只返回结果

希望这有点道理

const数据=[
{
标题:“标题2”,
订单:[
{
id:2,
职位:0
},
{
id:1,
职位:1
}
]
},
{
标题:“标题1”,
订单:[
{
id:1,
职位:0
},
{
id:2,
职位:1
}
]
}
];
常量排序=(数据,id)=>
data.sort(
(a,b)=>
a、 order.find(a=>a.id==id).position-
b、 order.find(a=>a.id==id).position
);

console.log(排序(数据,2))
谢谢您的帮助,这一行是
item.order[0].id===2
但是这是有问题的,因为它假定位置0的item.order始终是正确的引用。然后将排序部分作为一个函数,您可以将id作为参数传递并对其排序感谢帮助,这一行在这里
item.order[0].id===2
但是有问题,因为它假定位置0的item.order始终是正确的引用。然后将该排序部分作为函数,您可以将该id作为参数传递并排序
[
  {
    "title": "title 2",
    "order": [
      {
        "id": 2,
        "position": 0
      },
      {
        "id": 1,
        "position": 1
      }
    ]
  },
  {
    "title": "title 1",
    "order": [
      {
        "id": 1,
        "position": 0
      },
      {
        "id": 2,
        "position": 1
      }
    ]
  },
]
const unsortedArray = //[json that needs to be sorted]

function sortArray(parentArray, sortArray, match){
  for(i in parentArray.sortArray){
   if(parentArray.sortArray[i].id == match){
    //use this position to sort by
   }
  }
}

sortArray(unsortedArray,order,1);
const sampleArray = [
  {
    "title": "title 1",
    "order": [
      {
        "id": 1,
        "position": 0
      },
      {
        "id": 2,
        "position": 1
      }
    ]
  },
  {
    "title": "title 2",
    "order": [
      {
        "id": 2,
        "position": 0
      },
      {
        "id": 1,
        "position": 1
      }
    ]
   }
]


const swap = (arr, idx1, idx2) => {
    [arr[idx1], arr[idx2]] = [arr[idx2], arr[idx1]];
};

sampleArray.forEach((item,index) => {
    if(item.order[0].id === 2) {
        swap(sampleArray,index,index-1)
    }
})