Как отсортировать массив объекта в javascript по значению его свойства? - PullRequest
0 голосов
/ 21 февраля 2019

Имеет массив объектов, например:

Я хочу отсортировать itemsArray по его sortOrder.

Вот sortOrder элемента ( itemsArray ['item = a37d2733-f710-4e47-8573-6aab11f6d020 ']. SortOrder )

{
"Items": [
  {
    "sectionId": "section=38",
    "itemsArray": {
      "item=a37d2733-f710-4e47-8573-6aab11f6d020": {
        "itemObject": {
          "description": "Really good food.",
          "price": 1000,
          "name": "Cappuccino",
          "SKey": "item=a37d2733-f710-4e47-8573-6aab11f6d020",
        },
        "sortOrder": 3
      },
      "item=bd844a27-0a00-445d-a40a-785cf16fwine": {
        "itemObject": {
          "description": "Really good wine.",
          "price": 3000,
          "name": "Red Wine",
          "SKey": "item=bd844a27-0a00-445d-a40a-785cf16fwine",
        },
        "sortOrder": 1
      },
      "item=a37d2733-f710-4e47-8573-6aab11f6d016": {
        "itemObject": {
          "description": "Really good drink.",
          "price": 1000,
          "name": "Orange Juice",
          "SKey": "item=a37d2733-f710-4e47-8573-6aab11f6d016",
        },
        "sortOrder": 2
      },
      "item=bd844a27-0a00-445d-a40a-785cf16f4950": {
        "itemObject": {
          "description": "Really good drink.",
          "price": 1000,
          "name": "Coca-Cola - sanjy",
          "SKey": "item=bd844a27-0a00-445d-a40a-785cf16f4950",
        },
        "sortOrder": 0
      }
    },
    "description": "Non-alcoholic beverages.",
    "sectionName": "Beverages",
  }
 ]
}

После сортировки массив будет выглядеть так:

{
 "Items": [
  {
  "sectionId": "section=38",
  "itemsArray": {
    "item=bd844a27-0a00-445d-a40a-785cf16f4950": {
      "itemObject": {
        "description": "Really good drink.",
        "price": 1000,
        "name": "Coca-Cola - sanjy",
        "SKey": "item=bd844a27-0a00-445d-a40a-785cf16f4950",
      },
      "sortOrder": 0
    },
    "item=bd844a27-0a00-445d-a40a-785cf16fwine": {
      "itemObject": {
        "description": "Really good wine.",
        "price": 3000,
        "name": "Red Wine",
        "SKey": "item=bd844a27-0a00-445d-a40a-785cf16fwine",
      },
      "sortOrder": 1
    },
    "item=a37d2733-f710-4e47-8573-6aab11f6d016": {
      "itemObject": {
        "description": "Really good drink.",
        "price": 1000,
        "name": "Orange Juice",
        "SKey": "item=a37d2733-f710-4e47-8573-6aab11f6d016",
      },
      "sortOrder": 2
    },
    "item=a37d2733-f710-4e47-8573-6aab11f6d020": {
      "itemObject": {
        "description": "Really good food.",
        "price": 1000,
        "name": "Cappuccino",
        "SKey": "item=a37d2733-f710-4e47-8573-6aab11f6d020",
      },
      "sortOrder": 3
    }
  },
  "description": "Non-alcoholic beverages.",
  "sectionName": "Beverages",

}
]
}

Я уже пытаюсь здесь использовать array.sort метод, но безуспешно.Так что, если у кого-то есть решение, оно полезно.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Вот попробуйте, посмотрите и прочитайте комментарий

var data = {
"Items": [
  {
    "sectionId": "section=38",
    "itemsArray": {
      "item=a37d2733-f710-4e47-8573-6aab11f6d020": {
        "itemObject": {
          "description": "Really good food.",
          "price": 1000,
          "name": "Cappuccino",

        },
        "sortOrder": 3
      },
      "item=bd844a27-0a00-445d-a40a-785cf16fwine": {
        "itemObject": {
          "description": "Really good wine.",
          "price": 3000,
          "name": "Red Wine",

        },
        "sortOrder": 1
      },
      "item=a37d2733-f710-4e47-8573-6aab11f6d016": {
        "itemObject": {
          "description": "Really good drink.",
          "price": 1000,
          "name": "Orange Juice",
        },
        "sortOrder": 2
      },
      "item=bd844a27-0a00-445d-a40a-785cf16f4950": {
        "itemObject": {
          "description": "Really good drink.",
          "price": 1000,
          "name": "Coca-Cola - sanjy",

        },
        "sortOrder": 0
      }
    },
    "description": "Non-alcoholic beverages.",
    "sectionName": "Beverages",
  }
 ]
}


data.Items.forEach((item)=> {
var array = item.itemsArray;
// sort the array. 
var keys=  Object.keys(array).sort((a, b)=> {
    return array[a].sortOrder -  array[b].sortOrder
  });
  
  // and now create the new itemsArray
  var _itemsArray= {};
  keys.forEach((key)=> _itemsArray[key] =array[key])
  // last assign the itemsArray
  item.itemsArray = _itemsArray;
});

console.log(data.Items)
0 голосов
/ 21 февраля 2019

Я бы посчитал, что рефакторинг JSON можно отсортировать, например:

{
  "Items": [
    {
      "sectionId": "section=38",
      "sectionName": "Beverages",
      "description": "Non-alcoholic beverages.",
      "itemsArray": [
        {
          "id": "item=a37d2733-f710-4e47-8573-6aab11f6d020",
          "description": "Really good food.",
          "price": 1000,
          "name": "Cappuccino",
          "sortOrder": 3
        },
        {
          "id": "item=bd844a27-0a00-445d-a40a-785cf16fwine",
          "description": "Really good wine.",
          "price": 3000,
          "name": "Red Wine",
          "sortOrder": 1
        },
        {
          "id": "item=a37d2733-f710-4e47-8573-6aab11f6d016",
          "description": "Really good drink.",
          "price": 1000,
          "name": "Orange Juice",
          "sortOrder": 2
        },
        {
          "id": "item=bd844a27-0a00-445d-a40a-785cf16f4950",
          "description": "Really good drink.",
          "price": 1000,
          "name": "Coca-Cola - sanjy",
          "sortOrder": 0
        }
      ]
    }
  ]
}

Это можно отсортировать по возрастанию, используя сортировку: Items[0].itemsArray.sort((a, b) => a.sortOrder - b.sortOrder).

Изменения включают создание * 1007.* массив и перемещение идентификатора элемента в его собственное свойство в каждом элементе itemsArray.


Я не рекомендую сортировку по объекту, поскольку порядок сортировки ключей объекта исторически не гарантирован.Но следующая функция может отсортировать объект json в том виде, в каком он у вас сейчас есть, адаптированный из этого ответа переполнения стека :

function sortObject(o) {
    var sorted = {},
    key, a = [];

    for (key in o) {
        if (o.hasOwnProperty(key)) {
            a[o[key].sortOrder] = key;
        }
    }

    for (key = 0; key < a.length; key++) {
        sorted[a[key]] = o[a[key]];
    }
    return sorted;
}

json.Items[0].itemsArray = sortObject(json.Items[0].itemsArray);

Обратите внимание, что предполагается, что у вашего объекта json естьsortOrder свойство из 0...n, поскольку оно заполняет массив, добавляя к array[sortOrder] вместо array.push, а затем выполняет итерацию этого массива для заполнения объекта результата.

...