我有一個具有以下結構的物件:
let obj = {
"foo": ["orange", "apple", "pear", "grape", "lime"],
"bar": [12, 6, 18, 3, 22],
"bat": ["a", "b", "c", "d", "e"]
};
我想排序,bar但也保留foo和bat相對于的順序bar,如下所示:
obj = {
"foo": ["grape", "apple", "orange", "pear", "lime"],
"bar": [3, 6, 12, 18, 22],
"bat": ["d", "b", "a", "c", "e"]
};
有沒有一種整潔的方法可以做到這一點,或者我是否需要將其轉換為陣列陣列,按索引排序(例如,arr.sort((a,b) => a[1] - b[1]);),然后轉換回物件?
uj5u.com熱心網友回復:
const obj = {
"foo": ["orange", "apple", "pear", "grape", "lime"],
"bar": [12, 6, 18, 3, 22],
"bat": ["a", "b", "c", "d", "e"]
};
// get original indices of sorted bar
const indices = obj.bar
.map((value, index) => ({ value, index }))
.sort(({ value: a }, { value: b }) => a - b)
.map(({ index }) => index);
// iterate over obj's values to reorder according to indices
const res =
Object.entries(obj)
.reduce((acc, [key, value]) => ({ ...acc, [key]: indices.map(i => value[i]) }), {});
console.log(res);
uj5u.com熱心網友回復:
您可以基于所有值創建一個臨時陣列。然后,您可以根據 對該陣列進行排序bar。排序后,只需在迭代時將資料填充到新回應即可。
const obj = {
foo: ["orange", "apple", "pear", "grape", "lime"],
bar: [12, 6, 18, 3, 22],
bat: ["a", "b", "c", "d", "e"],
};
const arr = obj.bar
.map((bar, index) => ({
bar,
index,
}))
.sort((x, y) => x.bar - y.bar);
console.log(arr);
const res = arr.reduce(
(map, { bar, index }, i) => {
map.bar[i] = bar;
map.foo[i] = obj.foo[index];
map.bat[i] = obj.bat[index];
return map;
},
{ foo: [], bar: [], bat: [] }
);
console.log(res);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/321534.html
標籤:javascript 数组 排序 目的
