如何将对象数组转换为位置变化的数组

vktxenjb  于 2021-09-13  发布在  Java
关注(0)|答案(5)|浏览(439)

我有一个对象数组:

[
    { id: 'ade', value: 8 },
    { id: 'rtl', value: 17 },
    { id: 'enu', value: 11 }
]

并希望将其转换为:

[
    { id: 'enu', value: 11 },
    { id: 'rtl', value: 17 },
    { id: 'ade', value: 8 },
]

但我不能反转它等等,因为我必须设置一个语句来表示该项 { id: 'ade', value: 8 } 应为最后一项,其余项必须按id排序。
我试图用第二个数组减少第一个数组和concat

const firstArr = arr.reduce((acc, cv) => {
    if (cv.id === 'ade') {
        acc.push(cv)
    }
    return acc
}, []))

const second = arr.splice(firstArr, 1).sort()

firstArr.concat(second)

但它失败了,似乎过于工程化了。我想做得更聪明些。有什么想法吗?
请考虑任何建议!!

b5lpy0ml

b5lpy0ml1#

您可以使用spread运算符使代码看起来更短,但其逻辑相同:

const arr = //...your array of data
const parsedArr = [...arr.filter(o => o.id !== 'ade').sort((a, b) => a.id.localeCompare(b.id)), ...arr.filter(o => o.id === 'ade')];

因此,第一部分是所有数组元素,没有最后需要的特定元素,第二部分是最后一个元素。
希望我能帮忙:)

zbsbpyhn

zbsbpyhn2#

如果只是反转数组,请尝试使用 array.reversearray.map 带索引。

const arr = [
  { id: 'ade', value: 8 },
  { id: 'rtl', value: 17 },
  { id: 'enu', value: 11 }
];
const firstArr = arr.reverse();
const secondArr = arr.map((node, index) => {
  return arr[arr.length - 1 -index]
});
console.log(firstArr);
console.log(secondArr);
1wnzp6jl

1wnzp6jl3#

你可以用 Array.prototype.localeCompare 为了你的案子

let arr = [
  { id: 'ade', value: 8 },
  { id: 'rtl', value: 17 },
  { id: 'enu', value: 11 }
]
arr.sort((a,b) => `${a.value}`.localeCompare(`${b.value}`))

console.log(arr)
4dbbbstv

4dbbbstv4#

对于这种特殊情况,您可以使用自定义 sort 功能:

const sortedArr = [...arr].sort((a, b) => {
    return b.id.localeCompare(a.id)
})

但是如果在 arr 将有更多的对象需要重构排序函数

9cbw7uwe

9cbw7uwe5#

[
    { id: 'enu', value: 11 },
    { id: 'rtl', value: 17 },
    { id: 'ade', value: 8 },
].sort((a,b) => a.id == 'ade' ? 1 :  a.id > b.id ? 1 : -1)

相关问题