Как отсортировать объекты json по порядку другого json - PullRequest
2 голосов
/ 16 апреля 2019

У меня есть список парков (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"
}

Мне нужно отсортировать мой park_list в зависимости от порядка areaId в area_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"
    },

]

Мне действительно тяжело из-за этого.Я был бы очень признателен за любую помощь.

Ответы [ 2 ]

2 голосов
/ 16 апреля 2019

Вы можете взять Map для требуемого заказа и отсортировать по индексу того же ключа.

var 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: "2", areaName: "area2" }, { cityId: "1", areaId: "4", areaName: "area4" }, { cityId: "1", areaId: "1", areaName: "area1" }, { cityId: "1", areaId: "3", areaName: "area1" }],
    order = new Map(area_list.map(({ areaId }, i) => [areaId, i]));
    
park_list.sort(({ area_id: a }, { area_id: b }) => order.get(a) - order.get(b));

console.log(park_list);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 16 апреля 2019

Создайте объект, который сохраняет индекс каждого area_id, используя метод Array#reduce, а затем используйте объект для сортировки.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...