【问题标题】:Sorting JSON by values within the array (node.js)按数组中的值对 JSON 进行排序 (node.js)
【发布时间】:2019-12-18 04:22:35
【问题描述】:

在 node.js 程序中,我想通过数组中的特定键对 JSON 对象进行排序。例如,在这个 JSON 对象中,当“trip_name”等于 CC 时,我想按“trip_miles”值升序排序,最终只输出 id。所以最终输出应该是 002、003、001。但我不确定如何进行这种分层排序。这是link to JSBin,这是 JSON 对象:

[
  {
    "id": "001",
    "car": "Car 1",
    "trips":[
      {
        "trip_name": "FF",
        "trip_miles": 124
      },
      {
        "trip_name": "CC",
        "trip_miles": 200
      },
      {
        "trip_name": "BB",
        "trip_miles": 204
      },
      {
        "trip_name": "DD",
        "trip_miles": 209
      }
    ]
  },
  {
    "id": "002",
    "car": "Car 2",
    "trips":[
      {
        "trip_name": "AA",
        "trip_miles": 401
      },
      {
        "trip_name": "BB",
        "trip_miles": 903
      },
      {
        "trip_name": "CC",
        "trip_miles": 21
      },
      {
        "trip_name": "DD",
        "trip_miles": 439
      }
    ]
  },
  {
    "id": "003",
    "car": "Car 2",
    "trips":[
      {
        "trip_name": "RR",
        "trip_miles": 300
      },
      {
        "trip_name": "QQ",
        "trip_miles": 400
      },
      {
        "trip_name": "CC",
        "trip_miles": 50
      },
      {
        "trip_name": "DD",
        "trip_miles": 60
      }
    ]
  }
]

这是我尝试过的排序,但它不能正常工作:

 var sortedArray = myArray.sort(function(a,b){
      if (a.trips.trip_name == "CC" && b.trips.trip_name == "CC"){
          return a.trips.trip_miles - b.trips.trip_miles; 
      }
    })
    console.log(sortedArray);

【问题讨论】:

    标签: arrays json sorting npm


    【解决方案1】:

    同意@Karl Galvez 的解释,这是我的回答。最好在排序之前过滤掉名称为“CC”的不旅行的对象。但这完全取决于输入。如果所有对象的行程总是以“CC”开头,则无需担心过滤。

    var find_trip = function(trips){
      return trips.find(trip => trip.trip_name === "CC");
    }
    
    var sorted =  myArray
      // filter out objects which does not have a trip with trip name "CC"
      .filter(obj => {
        if(find_trip(obj.trips)){
          return true;
        }
      })
      .sort(
        (a,b) => {
          return find_trip(a.trips).trip_miles - find_trip(b.trips).trip_miles;  
        }
      )
      .map(obj => obj.id)
    
    console.log(sorted)
    

    输出:

    [“002”、“003”、“001”]

    【讨论】:

      【解决方案2】:

      我认为问题在于 myArray.sort 函数不会遍历每个对象中的 trips 数组。您需要一种方法来查找 "trip_name": "CC" 值,以便您可以使用它进行排序。下面是一些简单的代码,可以让myArraytrip 数组的trip_miles 排序。这不是很好,但希望它能让你走得更远。

      var sortedArray = myArray.sort(function(a,b){
        const aTripCC = a.trips.filter((x) => x.trip_name === "CC");
        const bTripCC = b.trips.filter((x) => x.trip_name === "CC");
      
        return aTripCC[0].trip_miles - bTripCC[0].trip_miles;
      })
      

      【讨论】:

      • 在访问trip_miles 属性之前最好检查aTripCC[0]bTripCC[0]对象是否未定义。此外,您可以使用 find 方法而不是 filter :)
      • 同意并感谢您的评论。在提供帮助和用勺子喂食答案之间有一条细线。我喜欢提供我认为有用的最高级别的答案。实施细节是其他问题。无论哪种方式,我都很高兴这个问题的答案是 OP 认为是正确的。我们都在一起:)
      猜你喜欢
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-22
      相关资源
      最近更新 更多