根据内部数组对数组进行排序
Sorting an array based on a inner array
我想根据按字母顺序排序的内部数组值对数组进行排序。例如。
我希望这个数组按前缀“old”排序,如旧 A、旧 B 等
const array = [
{ personName: "Vans", personTags: ["young", "old A"] },
{ personName: "Lia", personTags: ["young", "ok"] },
{ personName: "Rein", personTags: ["old B", "hairless", "ok"] },
{ personName: "Cris", personTags: ["old A", "old B", "acrounimouslyness"] },
{ personName: "Mercy", personTags: ["young", "hairless", "ok"] },
{ personName: "Cbum", personTags: ["old C", "hairless", "young"] },
];
变成
const array = [
{ personName: "Vans", personTags: ["young", "old A"] },
{ personName: "Cris", personTags: ["old A", "old B", "acrounimouslyness"] },
{ personName: "Rein", personTags: ["old B", "hairless", "ok"] },
{ personName: "Cbum", personTags: ["old C", "hairless", "young"] },
];
//将被删除
{ personName: "Lia", personTags: ["young", "ok"] },
{ personName: "Mercy", personTags: ["young", "hairless", "ok"] },
const array = [
{ personName: "Vans", personTags: ["young", "old A"] },
{ personName: "Lia", personTags: ["young", "ok"] },
{ personName: "Rein", personTags: ["old B", "hairless", "ok"] },
{ personName: "Cris", personTags: ["old B", "old A", "acrounimouslyness"] },
{ personName: "Mercy", personTags: ["young", "hairless", "ok"] },
{ personName: "Cbum", personTags: ["old C", "hairless", "young"] },
];
const getFirstOldElement = arr => {
return arr
.filter(s => s.startsWith("old"))
.sort()
.at(0);
};
const newArray = array
.filter(
obj =>
(obj.personTags || []).findIndex(s => s.startsWith("old")) !== -1
)
.sort((a, b) =>
getFirstOldElement(a.personTags).localeCompare(getFirstOldElement(b.personTags))
);
console.log(newArray);
- 使用
Array#reduce
, iterate over the array while updating an array of elements having an old tag. In each iteration, get the list of old tags using Array#filter
and String#startsWith
. If the list is not empty, push a new object to the accumulator with a special property sortedOldTags
which is basically the current old tags sorted (using Array#sort, String#localeCompare
, and Array#join
).
- 使用
Array#sort
,使用特殊的属性. 对上述数组进行排序
- 使用
Array#map
,return排序列表从每个元素中取出特殊属性。
const array = [
{ personName: "Vans", personTags: ["young", "old A"] },
{ personName: "Lia", personTags: ["young", "ok"] },
{ personName: "Rein", personTags: ["old B", "hairless", "ok"] },
{ personName: "Cris", personTags: ["old A", "old B", "acrounimouslyness"] },
{ personName: "Mercy", personTags: ["young", "hairless", "ok"] },
{ personName: "Cbum", personTags: ["old C", "hairless", "young"] },
];
const arrWithSortProp = array.reduce((arr, e) => {
const { personTags = [] } = e;
const oldTags = personTags.filter(tag => tag.startsWith("old"));
if(oldTags.length) {
arr.push({
...e,
sortedOldTags: oldTags.sort((a, b) => a.localeCompare(b)).join()
});
}
return arr;
}, []);
const sorted = arrWithSortProp
.sort(({ sortedOldTags: a }, { sortedOldTags: b }) => a.localeCompare(b))
.map(({ sortedOldTags, ...e }) => e);
console.log(sorted);
我想根据按字母顺序排序的内部数组值对数组进行排序。例如。
我希望这个数组按前缀“old”排序,如旧 A、旧 B 等
const array = [
{ personName: "Vans", personTags: ["young", "old A"] },
{ personName: "Lia", personTags: ["young", "ok"] },
{ personName: "Rein", personTags: ["old B", "hairless", "ok"] },
{ personName: "Cris", personTags: ["old A", "old B", "acrounimouslyness"] },
{ personName: "Mercy", personTags: ["young", "hairless", "ok"] },
{ personName: "Cbum", personTags: ["old C", "hairless", "young"] },
];
变成
const array = [
{ personName: "Vans", personTags: ["young", "old A"] },
{ personName: "Cris", personTags: ["old A", "old B", "acrounimouslyness"] },
{ personName: "Rein", personTags: ["old B", "hairless", "ok"] },
{ personName: "Cbum", personTags: ["old C", "hairless", "young"] },
];
//将被删除
{ personName: "Lia", personTags: ["young", "ok"] }, { personName: "Mercy", personTags: ["young", "hairless", "ok"] },
const array = [
{ personName: "Vans", personTags: ["young", "old A"] },
{ personName: "Lia", personTags: ["young", "ok"] },
{ personName: "Rein", personTags: ["old B", "hairless", "ok"] },
{ personName: "Cris", personTags: ["old B", "old A", "acrounimouslyness"] },
{ personName: "Mercy", personTags: ["young", "hairless", "ok"] },
{ personName: "Cbum", personTags: ["old C", "hairless", "young"] },
];
const getFirstOldElement = arr => {
return arr
.filter(s => s.startsWith("old"))
.sort()
.at(0);
};
const newArray = array
.filter(
obj =>
(obj.personTags || []).findIndex(s => s.startsWith("old")) !== -1
)
.sort((a, b) =>
getFirstOldElement(a.personTags).localeCompare(getFirstOldElement(b.personTags))
);
console.log(newArray);
- 使用
Array#reduce
, iterate over the array while updating an array of elements having an old tag. In each iteration, get the list of old tags usingArray#filter
andString#startsWith
. If the list is not empty, push a new object to the accumulator with a special propertysortedOldTags
which is basically the current old tags sorted (using Array#sort,String#localeCompare
, andArray#join
). - 使用
Array#sort
,使用特殊的属性. 对上述数组进行排序
- 使用
Array#map
,return排序列表从每个元素中取出特殊属性。
const array = [
{ personName: "Vans", personTags: ["young", "old A"] },
{ personName: "Lia", personTags: ["young", "ok"] },
{ personName: "Rein", personTags: ["old B", "hairless", "ok"] },
{ personName: "Cris", personTags: ["old A", "old B", "acrounimouslyness"] },
{ personName: "Mercy", personTags: ["young", "hairless", "ok"] },
{ personName: "Cbum", personTags: ["old C", "hairless", "young"] },
];
const arrWithSortProp = array.reduce((arr, e) => {
const { personTags = [] } = e;
const oldTags = personTags.filter(tag => tag.startsWith("old"));
if(oldTags.length) {
arr.push({
...e,
sortedOldTags: oldTags.sort((a, b) => a.localeCompare(b)).join()
});
}
return arr;
}, []);
const sorted = arrWithSortProp
.sort(({ sortedOldTags: a }, { sortedOldTags: b }) => a.localeCompare(b))
.map(({ sortedOldTags, ...e }) => e);
console.log(sorted);