JavaScript сортировка словарного массива - PullRequest
0 голосов
/ 14 февраля 2020

У меня вопрос по сортировке словарного объекта JS es6. Я пытаюсь отфильтровать массив, но все еще сохраняю структуру массива в объекте каждого месяца. Вот макет данных:

"soldListings": {
    "Jan - 2020": [
        {
            "id": 159,
            "user_id": 1,
            "type_id": 1,
        },
        {
            "id": 173,
            "user_id": 1,
            "type_id": 1,
        },
        {
            "id": 563,
            "user_id": 1,
            "type_id": 2,
        }
    ],
    "Dec - 2019": [
        {
            "id": 183,
            "user_id": 1,
            "type_id": 1,
        }
    ],
    "Oct - 2019": [
        {
            "id": 176,
            "user_id": 1,
            "type_id": 1,
        }
    ]
}

Если бы это был плоский массив объектов, я бы сделал что-то вроде:

typeFilter = data.filter((listing) => {
            if(listing.type_id){
                return listing.type_id == this.state.soldListTypeFilter ;    
            }
        });

ОБНОВЛЕНИЕ

Мне нужно вывод должен быть в том же формате, что и ввод. Например, если бы я отфильтровал объект по type_id = 2, он вернул бы это:

"soldListings": {
"Jan - 2020": [
    {
        "id": 563,
        "user_id": 1,
        "type_id": 2,
    }
],
"Dec - 2019": [

],
"Oct - 2019": [

]

}

1 Ответ

0 голосов
/ 14 февраля 2020

Используйте функцию keySort для этой задачи, для нецелочисленных ключей Чтение { ссылка }

keySort (object, sortfn?)

function keySort(obj, sort) {
  var keys = Object.keys(obj);
  keys = keys.sort(sort);
  var sortedObject = {};
  for (var i = 0; i < keys.length; i++) {
    sortedObject[keys[i]] = obj[keys[i]]
  }
  return sortedObject;
}

// Using
var obj = {
  "z:": "Zvalue",
  "a": "AValue"
};
console.log(obj);
obj = keySort(obj);
// or
obj = keySort(obj, (a, b) => {
  return a > b ? 1 : -1
});
console.log(obj)

Тест по вашему вопросу

function keySort(obj, sort) {
  var keys = Object.keys(obj);
  keys = keys.sort(sort);
  var sortedObject = {};
  for (var i = 0; i < keys.length; i++) {
    sortedObject[keys[i]] = obj[keys[i]]
  }
  return sortedObject;
}
data = {
  "Jan - 2020": [{
      "id": 159,
      "user_id": 1,
      "type_id": 1,
    },
    {
      "id": 173,
      "user_id": 1,
      "type_id": 1,
    },
    {
      "id": 563,
      "user_id": 1,
      "type_id": 2,
    }
  ],
  "Dec - 2019": [{
    "id": 183,
    "user_id": 1,
    "type_id": 1,
  }],
  "Oct - 2019": [{
    "id": 176,
    "user_id": 1,
    "type_id": 1,
  }]
}

data = keySort(data,function(a,b){
  adate = new Date(a);
  bdate = new Date(b);
  return adate>bdate ? 1 : -1;
})
console.log(data);
...