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

时间:2018-07-31 17:46:13

标签: javascript arrays angular typescript sorting

我有一个对象数组,我必须遍历这些对象,并按属性名称“ tagColor”对重复值进行分组,然后对分组的对象按名称进行排序。我完成了按颜色排序的第一步,现在我只需要按名称对那些组进行排序,就可以在4号角打字稿中实现

这是数组列表

 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排序的函数:

tags.sort((a, b) => a.tagType.tagColor.localeCompare(b.tagType.tagColor));

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

enter image description here

3 个答案:

答案 0 :(得分:7)

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

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

或更简洁但不易读的版本:

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

答案 1 :(得分:2)

除了给定的颜色顺序之外,您还可以为颜色使用定义的自定义顺序,并使用一个对象来反映该顺序。

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

(order[a.tagType.tagColor] || -Infinity) - (order[b.tagType.tagColor] || -Infinity)

最后,

(order[a.tagType.tagColor] || Infinity) - (order[b.tagType.tagColor] || Infinity)

或中间。

(colorOrder[a.tagType.tagColor] || 1.5) - (colorOrder[b.tagType.tagColor] || 1.5)

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);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:1)

首先按颜色比较,然后在排序功能中按名称比较。比较函数返回-1,0,1。如果b应该在a之后,则该函数返回-1-不需要排序,如果b等于a,则该函数返回0-不需要排序,如果b需要在a之前出现,然后函数返回1-需要的排序。因为-1和0的计算结果为false,而1的计算结果为true,则排序函数基本上返回的是true需要排序,或者false无需排序。因此,如果您按颜色进行比较并且需要对其进行排序,那么我们将传递colorSort值;如果不需要对颜色进行排序,那么我们将传递nameSort值

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