javascript - 如何使用另一个 json 的顺序对 json 对象进行排序

标签 javascript arrays json angular ionic3

我有一个公园列表(park_list),可以按距离和面积排序。

我已经使用下面的代码成功地按距离排序:

sortList(index){
  return function(a, b){
    return (a[index] === b[index] ? 0 : (a[index] < b[index] ? -1 : 1));
  }
}

但是,按面积排序的问题与按距离排序不同。我需要根据给定区域列表的顺序对区域进行排序(area_list)

我的park_list是这样的:

[
    {
        "parkName" : "park4",
        "area_id" : "4"
    },
    {
        "parkName" : "park2",
        "area_id" : "2"
    },
    {
        "parkName" : "park1",
        "area_id" : "1"
    },
    {
        "parkName" : "park3",
        "area_id" : "3"
    },

]

我的area_list是这样的:

{
    "cityId": "1",
    "areaId": "1",
    "areaName": "area1"
}, {
    "cityId": "1",
    "areaId": "2",
    "areaName": "area2"
}, {
    "cityId": "1",
    "areaId": "3",
    "areaName": "area3"
}, {
    "cityId": "1",
    "areaId": "4",
    "areaName": "area4"
}

我需要根据 area_listareaId 的顺序对 park_list 进行排序。

因此,如果我的 area_list 是这样的:

{
    "cityId": "1",
    "areaId": "2",
    "areaName": "area2"
}, {
    "cityId": "1",
    "areaId": "4",
    "areaName": "area4"
}, {
    "cityId": "1",
    "areaId": "1",
    "areaName": "area1"
}, {
    "cityId": "1",
    "areaId": "3",
    "areaName": "area1"
}

我的park_list应该像这样排序:

[
    {
        "parkName" : "park2",
        "area_id" : "2"
    },
    {
        "parkName" : "park4",
        "area_id" : "4"
    },
    {
        "parkName" : "park1",
        "area_id" : "1"
    },
    {
        "parkName" : "park3",
        "area_id" : "3"
    },

]

我真的很难受这个问题。我真的很感激任何形式的帮助。

最佳答案

使用Array#reduce创建一个对象来保存每个area_id的索引方法,然后使用该对象进行排序。

const area_list_index = area_list.reduce((obj, { areaId }, i) => {
  obj[areaId] = i;
  return obj;
}, {})


park_list.sort((a, b) => area_list_index[a.area_id] - area_list_index[b.area_id])

let park_list = [{
    "parkName": "park4",
    "area_id": "4"
  },
  {
    "parkName": "park2",
    "area_id": "2"
  },
  {
    "parkName": "park1",
    "area_id": "1"
  },
  {
    "parkName": "park3",
    "area_id": "3"
  },

]

let area_list = [{
  "cityId": "1",
  "areaId": "2",
  "areaName": "area2"
}, {
  "cityId": "1",
  "areaId": "4",
  "areaName": "area4"
}, {
  "cityId": "1",
  "areaId": "1",
  "areaName": "area1"
}, {
  "cityId": "1",
  "areaId": "3",
  "areaName": "area1"
}]

const area_list_index = area_list.reduce((obj, {
  areaId
}, i) => {
  obj[areaId] = i;
  return obj;
}, {})


park_list.sort((a, b) => area_list_index[a.area_id] - area_list_index[b.area_id])

console.log(park_list);

或者您可以使用Array#findIndex获取索引的方法,但效率不高。

park_list.sort((a, b) => area_list.findIndex((o) => o.areaId == a.area_id) - area_list.findIndex((o) => o.areaId == b.area_id))

let park_list = [{
    "parkName": "park4",
    "area_id": "4"
  },
  {
    "parkName": "park2",
    "area_id": "2"
  },
  {
    "parkName": "park1",
    "area_id": "1"
  },
  {
    "parkName": "park3",
    "area_id": "3"
  },

]

let area_list = [{
  "cityId": "1",
  "areaId": "2",
  "areaName": "area2"
}, {
  "cityId": "1",
  "areaId": "4",
  "areaName": "area4"
}, {
  "cityId": "1",
  "areaId": "1",
  "areaName": "area1"
}, {
  "cityId": "1",
  "areaId": "3",
  "areaName": "area1"
}]



park_list.sort((a, b) => area_list.findIndex((o) => o.areaId == a.area_id) - area_list.findIndex((o) => o.areaId == b.area_id))

console.log(park_list);

关于javascript - 如何使用另一个 json 的顺序对 json 对象进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55707520/

相关文章:

javascript - Lodash _.find 在参数中使用变量不起作用

javascript - JStree 异步搜索

javascript - 在 d3js Linechart 中展开线

python - 循环遍历 python 数组以匹配第二个数组中的多个条件,快速方法?

c - 扫描 C 中每个测试用例的字符串输入

javascript - 指定元素的位置,React-Bootstrap

arrays - 包含列表中每个单词的最小 "scrabble board"

java - 我如何将 JsonObject 映射到 java 中的另一个 JsonObject 以便在 API 之间进行通信

ios - 在 tableView 中显示用户评论

php - 来自 steamcommunity JSON 上的 PHP file_get_contents 的 JQuery $.getJSON