#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));