Javascript 基于另一个数组对json数据进行排序

Javascript 基于另一个数组对json数据进行排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有一个json数组和另一个数组用于排序顺序。现在我想根据排序数组项对json数组进行排序 var checkedIds =["2","1","4"];//sort order array //json array var jsonData1= { "ProductImages": [ { "checkBoxField": false, "itemId": 1, "rateValue":"$34" },

我有一个json数组和另一个数组用于排序顺序。现在我想根据排序数组项对json数组进行排序

    var checkedIds =["2","1","4"];//sort order array

   //json array 
    var jsonData1= {
        "ProductImages": [
                   { "checkBoxField": false, "itemId": 1, "rateValue":"$34" },
                   { "checkBoxField": false, "itemId": 2, "rateValue":"$34" },
                   { "checkBoxField": false, "itemId": 3, "rateValue":"$34" },
                   { "checkBoxField": false, "itemId": 4, "rateValue":"$34" },
                   { "checkBoxField": false, "itemId": 5, "rateValue":"$34" },
                   { "checkBoxField": false, "itemId": 6, "rateValue":"$34" },
                   { "checkBoxField": false, "itemId": 7, "rateValue":"$34" },
                   { "checkBoxField": false, "itemId": 8,"rateValue":"$34" }
        ]
    };
输出应该是

var jsonData1= {
        "ProductImages": [
                   { "checkBoxField": true, "itemId": 2, "rateValue":"$34" },
                   { "checkBoxField": true, "itemId": 1, "rateValue":"$34" },
                   { "checkBoxField": true, "itemId": 4, "rateValue":"$34" },
                   { "checkBoxField": false, "itemId": 3, "rateValue":"$34" },
                   { "checkBoxField": false, "itemId": 5, "rateValue":"$34" },
                   { "checkBoxField": false, "itemId": 6, "rateValue":"$34" },
                   { "checkBoxField": false, "itemId": 7, "rateValue":"$34" },
                   { "checkBoxField": false, "itemId": 8,"rateValue":"$34" }
        ]
    };

似乎您需要一种区别,即不寻找最小值,而是寻找列表中的下一个值

您可以使用一个哈希表来表示顺序和一个默认值,其大小足以将未排序的值移到末尾

var checkedds=[“2”、“1”、“4”],
jsonData1={“ProductImages”:[{“checkBoxField”:false,“itemId”:1,“rateValue”:“$34”},{“checkBoxField”:false,“itemId”:2,“rateValue”:“$34”},{“checkBoxField”:false,“itemId”:3,“rateValue”:“$34”},{“checkBoxField”:false,“itemId”:5,“rateValue”:“$34”},{“checkBoxField”:false,“itemId”:6,“rateValue”:“$34”},{“checkBoxField”:false,“itemId”:7,“rateValue”:“$34”},{“checkBoxField”:false,“itemId”:8,“rateValue”:“$34”}]};
jsonData1.ProductImages.sort(函数(散列){
checkedds.forEach(函数(a,i){
散列[a]=i+1;
});
返回函数(a,b){
return(hash[a.itemId]| | |无穷大)-(hash[b.itemId]| | |无穷大);
};
}(Object.create(null));

console.log(jsonData1);
您可以根据计算出的排名进行自定义排序:

var checkedds=[“2”、“1”、“4”];//排序顺序数组
//json数组
var jsonData1={ProductImages:[{checkBoxField:!1,itemId:1,rateValue:$34},{checkBoxField:!1,itemId:2,rateValue:$34},{checkBoxField:!1,itemId:3,rateValue:$34},{checkBoxField:!1,itemId:5,rateValue:$34},{checkBoxField:$1,itemId:6,rateValue:$34},{checkBoxField:7},{checkBoxField:!1,itemId:8,rateValue:$34}]};
功能getRank(项目){
var index=checkedds.indexOf(item.itemId.toString());
var秩=1;
如果(索引>-1){
排名*=(checkedds.length-索引)*-1;
}
返回等级;
}
jsonData1.ProductImages.sort(函数(a,b){
var r1=getRank(a);
var r2=getRank(b);

return r1>r2?1:r1思想是为JS中的排序函数编写一个自己的比较函数:

在这个比较函数中,您还可以直接设置
“checkBoxField”
值。(可能不是最有效的方法)

这是您的问题的一个示例:

var checkedIds =[2,1,4];//sort order array

   //json array 
var jsonData1= {
  "ProductImages": [
    { "checkBoxField": false, "itemId": 1, "rateValue":"$34" },
    { "checkBoxField": false, "itemId": 2, "rateValue":"$34" },
    { "checkBoxField": false, "itemId": 3, "rateValue":"$34" },
    { "checkBoxField": false, "itemId": 4, "rateValue":"$34" },
    { "checkBoxField": false, "itemId": 5, "rateValue":"$34" },
    { "checkBoxField": false, "itemId": 6, "rateValue":"$34" },
    { "checkBoxField": false, "itemId": 7, "rateValue":"$34" },
    { "checkBoxField": false, "itemId": 8,"rateValue":"$34" }
  ]
};

var arr = jsonData1["ProductImages"]
arr.sort(function compare(a, b) {
  if (checkedIds.indexOf(a["itemId"]) >= 0) {
    a["checkBoxField"] = true;
  }
  if (checkedIds.indexOf(b["itemId"]) >= 0) {
    b["checkBoxField"] = true;
  }
    if (checkedIds.indexOf(a["itemId"]) >= 0 && checkedIds.indexOf(b["itemId"]) < 0) {
      return -1;
  } 
  if (checkedIds.indexOf(b["itemId"]) >= 0 && checkedIds.indexOf(a["itemId"]) < 0) {
      return 1;
  } 
    return checkedIds.indexOf(a["itemId"])-checkedIds.indexOf(b["itemId"]);
 });

console.log(arr);
var checkedds=[2,1,4];//排序顺序数组
//json数组
var jsonData1={
“产品图像”:[
{“checkBoxField”:false,“itemId”:1,“rateValue”:“$34”},
{“checkBoxField”:false,“itemId”:2,“rateValue”:“$34”},
{“checkBoxField”:false,“itemId”:3,“rateValue”:“$34”},
{“checkBoxField”:false,“itemId”:4,“rateValue”:“$34”},
{“checkBoxField”:false,“itemId”:5,“rateValue”:“$34”},
{“checkBoxField”:false,“itemId”:6,“rateValue”:“$34”},
{“checkBoxField”:false,“itemId”:7,“rateValue”:“$34”},
{“checkBoxField”:false,“itemId”:8,“rateValue”:“$34”}
]
};
var arr=jsonData1[“产品图像”]
arr.sort(函数比较(a,b){
if(checkedds.indexOf(a[“itemId”])>=0){
a[“checkBoxField”]=真;
}
if(checkedds.indexOf(b[“itemId”])>=0){
b[“checkBoxField”]=真;
}
if(checkedds.indexOf(a[“itemId”])>=0&&checkedds.indexOf(b[“itemId”])<0{
返回-1;
} 
if(checkedds.indexOf(b[“itemId”])>=0&&checkedds.indexOf(a[“itemId”])<0{
返回1;
} 
返回checkedds.indexOf(a[“itemId”])-checkedds.indexOf(b[“itemId”]);
});
控制台日志(arr);
正如一条评论中提到的,您应该在
checkedds
数组中使用整数


这里是一个枯燥、不聪明但易于理解的迭代解决方案:

var sortMe=函数(ID、数据){
变量i,j,ret=[];
//首先获取具有匹配ID的项目:

对于(i=0;i您尝试过什么吗?还有,为什么您要在
checkedds
中将数字存储为字符串?到目前为止您尝试过什么?如何对不属于
checkedds
数组的元素进行排序?我认为有一种更好的方法来解决您尝试执行的操作。请参阅。为什么不制作
ProductImages
改为对象,并将
itemId
设为键?您可以在需要时使用
checkedIds
引用键。是否还需要
“checkBoxField”:true,