Из того, что я понимаю, вы получите три массива. Эти массивы будут иметь одинаковую длину с индексом, представляющим, какой строкой в таблице они являются. Вам нужно отсортировать индексы всех трех массивов на основе значений одного. Это означает, что вам необходимо убедиться, что при перемещении значения в одном массиве значения всех других массивов перемещаются одинаково.
К сожалению, я не знаю, как это сделать с нативными функциями. Вы должны были бы реализовать сортировку самостоятельно, чтобы управлять этим способом.
Во внешнем интерфейсе лучше иметь связанные данные, структурированные как массив объектов, а не как набор связанных табличных массивов. Таким образом, вы можете более интуитивно выполнять сортировку, поиск, фильтры и т. Д. c. Давайте go о том, как это сделать.
Я буду использовать ваш тестовый объект:
var testObject = {
id_values: [20, 10, 40],
od_values: [30, 15, 2],
qty_values: [6, 3, 15]
};
Чтобы преобразовать связанные массивы в массив объектов, содержащих связанные данные, я создам экземпляр массива с нулевым заполнением с тем же номером индексов в виде таблиц. Затем мы сопоставляем этот пустой массив, создавая объект из данных в каждой таблице:
const dataArray = new Array(obj[by].length).fill(0).map((_, i) => {
return {
id_values: testObject.id_values[i],
od_values: testObject.od_values[i],
qty_values: testObject.qty_values[i]
}
}) .sort((a, b) => a[by] > b[by])
На этом этапе таблицы будут преобразованы в более JavaScript дружественный массив объектов, который будет выглядеть следующим образом:
const dataArray = [
{ id_values: 20, od_values: 30, qty_values: 6 },
{ id_values: 10, od_values: 15, qty_values: 3 },
{ id_values: 40, od_values: 2, qty_values: 15 }
]
Теперь ТО можно легко отсортировать с помощью собственной сортировки массива:
dataArray.sort((a, b) => a.od_values > b.od_values)
, что приведет к сортировке!
const sortedData = [
{ id_values: 40, od_values: 2, qty_values: 15 },
{ id_values: 10, od_values: 15, qty_values: 3 },
{ id_values: 20, od_values: 30, qty_values: 6 }
]
Значения могут быть деструктурированы в связанные таблицы путем сокращения массива объектов:
dataArray.reduce((acc, el) => {
Object.keys(el).map(col => {
acc[col].push(el[col])
})
return acc
}, {
id_values: [],
od_values: [],
qty_values: []
})
Получается исходная структура данных, но сортируется по выбранному атрибуту:
const sortedArrays = {
id_values: [ 40, 10, 20 ],
od_values: [ 2, 15, 30 ],
qty_values: [ 15, 3, 6 ]
}
Собираем все вместе:
var testObject = {
id_values: [20, 10, 40],
od_values: [30, 15, 2],
qty_values: [6, 3, 15]
};
const sortTableObj = (obj, by) => {
const dataArray = new Array(obj[by].length).fill(0).map((_, i) => {
return {
id_values: testObject.id_values[i],
od_values: testObject.od_values[i],
qty_values: testObject.qty_values[i]
}
}).sort((a, b) => a[by] > b[by])
console.log('dataArray: ', dataArray)
return dataArray.reduce((acc, el) => {
Object.keys(el).map(col => {
acc[col].push(el[col])
})
return acc
}, {
id_values: [],
od_values: [],
qty_values: []
})
}
sortTableObj(testObject, 'od_values')
Дайте мне знать, если у вас есть какие-либо вопросы!