javascript - 数组排序有两个要求

标签 javascript arrays sorting

我已经解决了对数组进行排序的麻烦,该数组应该按接下来的两个要求进行排序:

  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)

有什么建议吗?

最佳答案

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

说明:一元加用于将 bool 值转换为数字,如果这些 bool 值的差值是,然后使用 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));

关于javascript - 数组排序有两个要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54240562/

相关文章:

javascript - Angular 只读范围行为很奇怪

javascript - 如何以嵌套方式将预定义指令 (ng-click) 与自定义指令结合使用?

php - 使用 PHP 的准备语句将数组插入 MySQL 数据库

javascript - 在 Firebase 中获取和存储多维数组而不是 JSON

Java:使用外部参数对数组进行排序

javascript - 使 Magento 1.9 产品过滤器可折叠

javascript - 如何从 L.Routing.control 获取距离和时间?

javascript - 将参数添加到函数以仅在值与数组中的名称匹配时执行

java - 对具有重复条目的数组进行排序后获取唯一索引

JavaScript - 按时间字符串排序