基于内部数组对一个数组进行排序

3
我想按内部数组的字母顺序对一个数组进行排序,例如:
我想让这个数组按前缀“old”排序,所以是 old A、old 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: ["年轻", "还行"] }, { personName: "Mercy", personTags: ["年轻", "无毛发", "还行"] },


当出现平局时,规则是什么? - trincot
2个回答

2
  • 使用Array#reduce,在更新旧标签元素数组的同时遍历数组。在每次迭代中,使用Array#filterString#startsWith获取旧标签列表。如果列表不为空,则将一个新对象推送到累加器中,该对象具有特殊属性sortedOldTags,该属性基本上是当前旧标签排序后的结果(使用Array#sort, String#localeCompareArray#join)。
  • 使用Array#sort,使用特殊属性对上述数组进行排序。
  • 使用Array#map,返回已排序列表,并从每个元素中删除特殊属性。

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);


1

您可以使用筛选然后排序

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);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接