代码之家  ›  专栏  ›  技术社区  ›  Adam Orłowski

数组排序有两个要求

  •  0
  • Adam Orłowski  · 技术社区  · 6 年前

    我已经解决了排序一个数组的问题,这个数组应该按照以下两个要求排序:

    1. 具有上必需的属性 true 应该先列出。
    2. 然后按字母顺序

    我已经做到了,而且很有效,但是我觉得有一个聪明的方法…- -

    const originalAttributes = [{
        name: "P",
        required: false
      },
      {
        name: "D",
        required: true
      },
      {
        name: "W",
        required: true
      },
      {
        name: "A",
        required: true
      },
      {
        name: "N",
        required: false
      },
      {
        name: "S",
        required: false
      }
    ];
    
    function listNames(originalAttributes) {
      originalAttributes.forEach(item => {
        console.log(`${item.name} ${item.required ? '--R' : ''}`);
      })
    }
    
    listNames(originalAttributes)
    
    console.log('------------------------------');
    
    const sortedAttributes = originalAttributes.sort((a, b) => {
      if (a.required && b.required) {
        return a.name < b.name ? -1 : 1;
      } else if (a.required) {
        return -1
      } else if (!b.required) {
        return a.name < b.name ? -1 : 1;
      }
    });
    
    listNames(sortedAttributes)

    有什么建议吗?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Shidersz    6 年前

    您可以像在下一个示例中那样进行处理。

    说明: 这个 unary plus 如果布尔值的差的结果是 zero ,然后使用比较条件 name 场与 localeCompare() .

    const originalAttributes = [
        {name: "P", required: false},
        {name: "D", required: true},
        {name: "W", required: true},
        {name: "A", required: true},
        {name: "N", required: false},
        {name: "S", required: false},
        {name: "SI", required: false}
    ];
    
    let res = originalAttributes.sort((a, b) =>
        (+b.required - +a.required) || a.name.localeCompare(b.name)
    );
    
    const listNames = a => a.map(
        i => `${i.name} ${i.required ? '--R' : ''}`
    ).join("\n");
    
    console.log(listNames(res));