根据值重新排列JSON的一部分

Rearrange part of JSON based on a value

本文关键字:排列 JSON 一部分 新排列      更新时间:2023-09-26

我有以下JSON,我想根据'排名'重新安排,如果类型是'水果'或'肉'。并保持JSON的其余部分按其出现的顺序。"水果"answers"肉类"类型将具有等级,但"蔬菜"answers"日记"类型的等级不是强制性的,在某些情况下可能没有。

原始值:

var results = {"docs":[
  {"type":"fruit","name":"apple","rank": 10}, 
  {"type":"vegetable","name":"carrot","rank": 0}, 
  {"type":"fruit","name":"grape","rank": 9}, 
  {"type":"meat","name":"beef","rank": 9}, 
  {"type":"meat","name":"fish","rank": 10.1}, 
  {"type":"vegetable","name":"tamato"}, 
  {"type":"meat","name":"chicken","rank": 10}, 
  {"type":"diary","name":"eggs"}, 
  {"type":"vegetable","name":"peas","rank": 0}, 
  {"type":"fruit","name":"orange","rank": 9.1}, 
  {"type":"diary","name":"milk","rank": 10},
  {"type":"fruit","name":"banana","rank": 9.8}
]};

期望值:

var results = {"docs":[
  {"type":"fruit","name":"apple","rank": 10}, 
  {"type":"fruit","name":"banana","rank": 9.8},
  {"type":"fruit","name":"orange","rank": 9.1}, 
  {"type":"fruit","name":"grape","rank": 9}, 
  {"type":"meat","name":"fish","rank": 10.1}, 
  {"type":"meat","name":"chicken","rank": 10}, 
  {"type":"meat","name":"beef","rank": 9}, 
  {"type":"vegetable","name":"carrot","rank": 0}, 
  {"type":"vegetable","name":"tamato"}, 
  {"type":"diary","name":"eggs"}, 
  {"type":"vegetable","name":"peas","rank": 0}, 
  {"type":"diary","name":"milk","rank": 10}
]};

提前感谢。谢谢你的帮助。

JSON对象的docs元素是JSON对象的数组,因此可以使用array .sort()方法对JSON对象进行排序(参见:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)。诀窍是编写一个排序函数,以您希望的方式对JSON对象进行排序。

我将其分解为两个函数,一个按类型排序,另一个按秩排序。

按类型排序时,我们希望水果排序到比肉类低的索引,乳制品和蔬菜排序到比水果或肉类低的索引。我们可以使用compareType中类型数组的索引来帮助我们按类型排序。"水果"的索引大于"肉类"的索引,数组中任何东西("乳制品"answers"蔬菜")的索引都是-1。types数组中的较低索引对应于最终排序数组中的较高索引。如果a。type <B.type,返回1。>

按顺序排序时,高的顺序应按低的顺序排序。最后一个sort函数首先比较对象的类型,如果类型相等,则比较它们的秩。

var results = {"docs":[
  {"type":"fruit","name":"apple","rank": 10}, 
  {"type":"vegetable","name":"carrot","rank": 0}, 
  {"type":"fruit","name":"grape","rank": 9}, 
  {"type":"meat","name":"beef","rank": 9}, 
  {"type":"meat","name":"fish","rank": 10.1}, 
  {"type":"vegetable","name":"tamato"}, 
  {"type":"meat","name":"chicken","rank": 10}, 
  {"type":"diary","name":"eggs"}, 
  {"type":"vegetable","name":"peas","rank": 0}, 
  {"type":"fruit","name":"orange","rank": 9.1}, 
  {"type":"diary","name":"milk","rank": 10},
  {"type":"fruit","name":"banana","rank": 9.8}
]};
function compareRank(a, b) {
  if(a.rank < b.rank) {
    return 1;
  }
  else if(a.rank > b.rank) {
    return -1;
  }
  else {
    return 0;
  }
}
function compareType(a, b) {
  var types = ["meat", "fruit"];
  if(a.type === b.type) {
    return 0;
  }
  else if(types.indexOf(a.type) < types.indexOf(b.type)) {
    return 1;
  }
  else {
    return -1;
  }
}
var docs = results.docs;
docs.sort(function(a, b) {
  if(compareType(a, b) === 0) {
    return compareRank(a, b);
  }
  else {
    return compareType(a, b);
  }
});