Как отсортировать объект объектов на основе ключей в порядке убывания?

#javascript #json #reactjs

#javascript #json #reactjs

Вопрос:

Я пытаюсь упорядочить массив объектов объектов на основе ключа объекта. Как мне выполнить сортировку объекта JSON, который уже находится в порядке возрастания? Пожалуйста, смотрите ниже.

Я попытался преобразовать объект значения данных в его собственный массив, а затем отсортировать его таким образом, но я получаю синтаксические ошибки.

 var object = [
A1: {
errors: {}
otherData: {}
data: {
  "1": {
    "name": "Ashley",
  },
  "2": {
    "name": "Cardiff",
  },
  "3": {
    "name": "Reading",
    }
}},

A2: {
errors: {}
otherData: {}
data: {
  "4": {
    "name": "Susan",
  },
  "5": {
    "name": "Bee",
  },
  "6": {
    "name": "Bob",
    }
}}];
  

Я хочу, чтобы это было:

 var object = [
A1: {
errors: {}
otherData: {}
data: {
  "3": {
    "name": "Reading",
  },
  "2": {
    "name": "Cardiff",
  },
  "1": {
    "name": "Ashley",
    }
}},

A2: {
errors: {}
otherData: {}
data: {
  "6": {
    "name": "Bob",
  },
  "5": {
    "name": "Bee",
  },
  "4": {
    "name": "Susan",
    }
}}];
  

Комментарии:

1. Объекты не отслеживают порядок ключей. Я бы посоветовал вам использовать массив объектов.

2. я обновил свой ответ, адаптированный к вашим потребностям. Пожалуйста, посмотрите.

Ответ №1:

Если я правильно понимаю, вы хотите отсортировать объекты в алфавитном порядке по первой букве. Это вроде как там, но оно должно делать то, что вы ищете

 const arr1 = object.map(function(o) {
     return Object.values(o[Object.keys(o)].data).sort((a, b) => a - b);
})
  

Я попытаюсь объяснить, что здесь происходит. map выполняется итерация по каждому объекту в массиве и возвращает совершенно новый массив. o[Object.keys(o)].data это выбор A1 и A2 ключи данных. Затем мы говорим, что нам нужны значения объектов в этих объектах данных с окружением Object.keys() , которое дает нам имена. Оттуда мы просто вызываем sort и даем ему обратный вызов.

Комментарии:

1. Привет, спасибо за ответ. Но я имел в виду, что я хочу отсортировать по ключам в A1 и A2 в порядке убывания. Например, A1 имеет ключи 1, 2, 3. Я хочу, чтобы он возвращал полную коллекцию с A1, имеющим ключи в порядке 3, 2, 1.

Ответ №2:

 const sortByField = (field, isRevered = false, primerFn) => {
  if (field) {
    var key = primerFn ? (x) => primerFn(x[field]) : (x) => x[field];

    isRevered = !isRevered ? 1 : -1;

    return (a, b) => {
      /*eslint-disable */
      return a = key(a), b = key(b), isRevered * ((a > b) - (b > a));
      /*eslint-enable */
    }
  }
  else {
    return (a, b) => {
      return isRevered ? a < b : a > b;
    }
  }
}

var dataToSort = {
  A1: {
    errors: {},
    otherData: {},
    data: {
      "1": { "name": "Ashley", },
      "2": { "name": "Cardiff", },
      "3": { "name": "Reading", }
    }
  },
  A2: {
    errors: {},
    otherData: {},
    data: {
      "4": { "name": "Susan", },
      "5": { "name": "Bee", },
      "6": { "name": "Bob", }
    }
  }
};

const sortObjectByKeys = (obj) => {
  let values = [];
  let keys = [];
  Object.keys(obj).forEach(key => {
    keys.push(key);
    values.push(obj[key])
  })

  values.sort(sortByField("name", true, (value) => value.toLowerCase()));

  let sortedObject = {};

  values.forEach((value, index) => {
    sortedObject[keys[index]] = value;
  })

  return sortedObject;
}

let sortedData = {};
Object.keys(dataToSort).forEach(dataKey => {
  sortedData[dataKey] = {
    ...dataToSort[dataKey],
    data: sortObjectByKeys(dataToSort[dataKey].data)
  }
})

console.log(JSON.stringify(sortedData));