首页 > 解决方案 > 如何使用 javascript 对嵌套数组对象进行排序

问题描述

我想知道如何使用javascript根据顺序过滤和获取对象

我有一个obj如下所示的,应该根据 order 和 concat 进行过滤。

`obj` with `no error key && amt > min` should display at the top in sorted manner by amt.
`obj` with `amt<min` should display next 
`obj` with `error` should display last
var output = orderData(obj);
function orderData(obj){
  var minData = obj.filter(e=>e.amt<e.min);
  var errData = obj.filter(e=>e.hasOwnProperty("error"));
  var validData = obj.filter(e=>!e.hasOwnProperty("min") && !e.hasOwnProperty("error"));
  var result = validData.concat(errData).concat(minData);
return result;
}

var obj =[{
 "id": "trans",
 "amt": 1000
},{
 "id": "fund",
 "amt": 500
},{
  "id": "inst",
  "amt": 2000,
  "error": "invalid"
},{
  "id": "wf",
  "amt": 600,
  "min":  2000
},{
  "id": "sf",
  "amt": 500,
  "min": "250"
}]

预期输出:

[{
 "id": "fund",
 "amt": 500
},{
  "id": "sf",
  "amt": 500,
  "min": "250"
},{
 "id": "trans",
 "amt": 1000
},{
  "id": "wf",
  "amt": 600,
  "min":  2000
},{
  "id": "inst",
  "amt": 2000,
  "error": "invalid"
}]

标签: javascriptarrayssortingobject

解决方案


我认为这个功能会做你想要的。它与您的类似,但包括对minsand的额外检查validsamt然后它在将它们连接在一起之前通过升序对每个数组进行排序:

var obj =[{
 "id": "trans",
 "amt": 1000
},{
 "id": "fund",
 "amt": 500
},{
  "id": "inst",
  "amt": 2000,
  "error": "invalid"
},{
  "id": "wf",
  "amt": 600,
  "min":  2000
},{
  "id": "sf",
  "amt": 500,
  "min": "250"
}];

function sortObj(a, b) {
  return a.amt - b.amt;
}

function orderData(obj) {
   errors = obj.filter(e => e.hasOwnProperty('error'));
   errors.sort(sortObj);
   mins   = obj.filter(e => !e.hasOwnProperty('error') && e.hasOwnProperty('min') && e.amt < e.min);
   mins.sort(sortObj);
   valids = obj.filter(e => !e.hasOwnProperty('error') && (!e.hasOwnProperty('min') || e.amt > e.min));
   valids.sort(sortObj);
   return valids.concat(mins).concat(errors);
}

console.log(orderData(obj));


推荐阅读