Я собираюсь написать функцию для сортировки любого JSON с любой структурой (просто знайте, что это массив объектов, например, список продуктов), используя другой объект в качестве аргумента, чтобы определить, какая сортировка выполняется в соответствии с какой ключ.
// The json that I get might looks like something like this.
// I just write one item of the array, but all of them are the same.
// But the blueprint of the items in each json are different.
const dataArray = [
{
id: 100,
name: 'product_1',
price: 99.95,
color: ['#fff', '#f0f', '#00f'],
category: ['cat_1', 'cat_2'],
booleanKey: true,
foo: {
foo1: 12,
foo2: 'string value',
foo3: {
foo3_1: 'string value',
foo3_2: 732.342
},
foo4: [
{
foo4_1_1: 853,
foo4_1_2: 24,
},
{
foo4_2_1: 'string value',
foo4_2_2: 435,
foo4_2_3: 25.35,
}
]
},
bar: {
bar1: {
bar1_1: 313,
bar1_2: 32.73
},
bar2: 75.3
}
}
];
// The function to sort the array
const sortData = obj => {
return dataArray.sort((a, b) => {
// Do something to return the correct value
});
}
// Sort array ascending by value 1, and descending by value -1
const result = sortData({foo: {foo3: {foo3_2: 1}}});
const anotherResult = sortData({bar: {bar2: -1}});
const anotherResult = sortData({price: 1});
Поскольку я должен написать функцию для сортировки любых элементов с любой структурой, я должен использовать объект obj, который они передают мне в качестве аргумента, для сортировки базы массива по этому ключу этого объекта.
Я нашел это решение так:
// The sample array that be used from the other answer
const fooArray = [
{ foo1: { foo2: { foo3: 123 } } },
{ foo1: { foo2: { foo3: 987 } } },
{ foo1: { foo2: { foo3: 456 } } },
{ foo1: { foo2: { foo3: 789 } } },
{ foo1: { foo2: { foo3: 321 } } },
{ foo1: { foo2: { foo3: 654 } } }
];
const sortData = obj => {
const pathArray = [];
while(typeof(obj) == 'object') {
pathArray.push(Object.keys(obj)[0]);
obj = obj[pathArray[pathArray.length - 1]];
}
const order = obj;
return fooArray.sort((a, b) => {
for(let pathKey of pathArray) {
a = a[pathKey];
b = b[pathKey];
}
return (a - b) * order;
});
}
const foo = sortData({ foo1: { foo2: { foo3: 1 } } });
Любая другая рекомендация или идея?