1 回答
TA贡献1780条经验 获得超5个赞
据我了解,您最终得到了三个数组。这些数组将具有一致的长度,索引表示它们在表中的哪一行。您想要的是根据一个的值对所有三个数组的索引进行排序。这意味着您需要确保每当移动一个数组中的值时,所有其他数组的值都会从相同的位置移动。
不幸的是,我知道本机函数无法做到这一点。您必须自己实现排序才能以这种方式管理它。
在前端,最好将关联数据结构化为对象数组,而不是一组关联的表状数组。这样,您可以更直观地执行排序、搜索、过滤等。让我们来看看如何做到这一点。
我将使用您的测试对象:
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')
如果您有任何问题,请告诉我!
添加回答
举报