首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分组将javascript数组中的值复制在一起,然后按值名称的升序对这些组进行排序

分组将javascript数组中的值复制在一起,然后按值名称的升序对这些组进行排序
EN

Stack Overflow用户
提问于 2018-08-01 01:46:13
回答 3查看 1.3K关注 0票数 3

我有一个对象数组,我必须遍历这些对象,并按属性名称"tagColor“对重复的值进行分组,然后按名称对分组的对象进行排序。我实现了按颜色排序的第一步,现在我只需要按名称排序这些组,在angular 4中实现这一点,typescript

这是数组列表

代码语言:javascript
复制
 tags =    [
      {
        "tagType": {
          "name": "a",
          "tagColor": "#0000FF"
        }
      },
      {

        "tagType": {
          "name": "a",
          "tagColor": "#FF0000"
        }
      },
      {

        "tagType": {
          "name": "c",
          "tagColor": "#FF0000",
        }
      },
      {
        "tagType": {
          "name": "b",
          "tagColor": "#FF0000",
        }
      },
      {
        "tagType": {
          "name": "b",
          "tagColor": "#0000FF",
        }
      }
    ]

我的按tagColor排序的函数:

代码语言:javascript
复制
tags.sort((a, b) => a.tagType.tagColor.localeCompare(b.tagType.tagColor));

仅按颜色分组,但如何按字母顺序对这些组进行排序?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-01 01:52:18

您可以使用单个排序调用,如果比较标记的结果是0,则按名称进行比较:

代码语言:javascript
复制
tags.sort((a, b) => {
    let result = b.tagType.tagColor.localeCompare(a.tagType.tagColor);
    if(result == 0) {
        return a.tagType.name.localeCompare(b.tagType.name);
    }
    return result;
});

或者一个更简洁但可读性较差的版本:

代码语言:javascript
复制
tags.sort((a, b) =>
    b.tagType.tagColor.localeCompare(a.tagType.tagColor) // if this is 0 (aka falsy) return the other value
        || a.tagType.name.localeCompare(b.tagType.name));
票数 7
EN

Stack Overflow用户

发布于 2018-08-01 01:59:51

除了给定的按颜色排序之外,您还可以使用为颜色定义的自定义顺序,以及反映该顺序的对象。

对于在对象中找不到的颜色,您可以采用默认值将此颜色移动到定义的位置,

代码语言:javascript
复制
(order[a.tagType.tagColor] || -Infinity) - (order[b.tagType.tagColor] || -Infinity)

到最后,

代码语言:javascript
复制
(order[a.tagType.tagColor] || Infinity) - (order[b.tagType.tagColor] || Infinity)

或者介于两者之间。

代码语言:javascript
复制
(colorOrder[a.tagType.tagColor] || 1.5) - (colorOrder[b.tagType.tagColor] || 1.5)

代码语言:javascript
复制
var tags = [{ tagType: { name: "a", tagColor: "#0000FF" } }, { tagType: { name: "a", tagColor: "#FF0000" } }, { tagType: { name: "c", tagColor: "#FF0000" } }, { tagType: { name: "b", tagColor: "#FF0000" } }, { tagType: { name: "b", tagColor: "#0000FF" } }],
	colorOrder = { "#0000FF": 1, "#FF0000": 2 };


tags.sort((a, b) =>
    colorOrder[a.tagType.tagColor] - colorOrder[b.tagType.tagColor] ||
    a.tagType.name.localeCompare(b.tagType.name)
);

console.log(tags);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 2
EN

Stack Overflow用户

发布于 2018-08-01 02:06:12

首先按颜色比较,然后在排序函数中按名称进行比较。compare函数返回- 1,0,1。如果b应该在a之后,则函数返回a -1 -不需要排序,如果b等于a,函数返回0-不需要排序,如果b需要在a之前,则函数返回1-需要排序。由于-1和0的计算结果为false,而1的计算结果为true,基本上排序函数返回的是true,需要排序的是true,否则不需要排序。因此,如果按颜色进行比较,需要对其进行排序,则传递colorSort值;如果不需要对颜色进行排序,则传递nameSort值

代码语言:javascript
复制
tags.sort((a, b) => {
  let colorSort = a.tagType.tagColor.localeCompare(b.tagType.tagColor);
  let nameSort = a.tagType.name.localeCompare(b.tagType.name);
  return (colorSort)? colorSort:nameSort;
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51619223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档