【问题标题】:Javascript Grouping and SortingJavascript 分组和排序
【发布时间】:2021-04-18 17:06:09
【问题描述】:

我有如下随机城市列表。如何按照以下标准对其进行分组和排序

  1. SortAndGroup 函数应该输入 countryCode 并相应地排序,每个组的首府城市排在第一位,然后是该国家/地区的城市。感谢您的帮助。

    随机城市 =

      [
             {
                 "name": "Delhi",
                 "countryCode": "IN",
                 "isCapitol": true
             },
             {
                 "name": "New York",
                 "countryCode": "USA",
                 "isCapitol": false
             },
             {
                 "name": "Birmingham",
                 "countryCode": "UK",
                 "isCapitol": false
             },
             {
                 "name": "London",
                 "countryCode": "UK",
                 "isCapitol": true
             },
             {
                 "name": "Hyderabad",
                 "countryCode": "IN",
                 "isCapitol": false
             },
             {
                 "name": "Chicago",
                 "countryCode": "USA",
                 "isCapitol": false
             },
             {
                 "name": "Bristol",
                 "countryCode": "UK",
                 "isCapitol": false
             },
             {
                 "name": "Washington",
                 "countryCode": "USA",
                 "isCapitol": true
             }
         ]
    

    最终结果应该是

    sortByCountry(美国、英国、印度)=

     [
         {
             "name": "Washington",
             "countryCode": "USA",
             "isCapitol": true
         },
         {
             "name": "Chicago",
             "countryCode": "USA",
             "isCapitol": false
         },
         {
             "name": "New York",
             "countryCode": "USA",
             "isCapitol": false
         },
         {
             "name": "London",
             "countryCode": "UK",
             "isCapitol": true
         },
         {
             "name": "Birmingham",
             "countryCode": "UK",
             "isCapitol": false
         },
         {
             "name": "Bristol",
             "countryCode": "UK",
             "isCapitol": false
         },
         {
             "name": "Delhi",
             "countryCode": "IN",
             "isCapitol": true
         },
         {
             "name": "Hyderabad",
             "countryCode": "IN",
             "isCapitol": false
         } 
     ]
    

【问题讨论】:

    标签: javascript sorting arraylist


    【解决方案1】:

    您可以从数组中获取订单(带有相应的国家名称)并按首都排序。

    const
        sortByCountry = (...countries) => (a, b) =>
            countries.indexOf(a.countryCode) - countries.indexOf(b.countryCode) ||
            b.isCapitol - a.isCapitol,
        array = [{ name: "Delhi", countryCode: "IN", isCapitol: true }, { name: "New York", countryCode: "USA", isCapitol: false }, { name: "Birmingham", countryCode: "UK", isCapitol: false }, { name: "London", countryCode: "UK", isCapitol: true }, { name: "Hyderabad", countryCode: "IN", isCapitol: false }, { name: "Chicago", countryCode: "USA", isCapitol: false }, { name: "Bristol", countryCode: "UK", isCapitol: false }, { name: "Washington", countryCode: "USA", isCapitol: true }];
    
    array.sort(sortByCountry('USA', 'UK', 'IN'));
    
    console.log(array);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    ES5

    var sortByCountry = function () {
            var countries = Array.prototype.slice.call(arguments);
            return function (a, b) {
                return countries.indexOf(a.countryCode) - countries.indexOf(b.countryCode) ||
                    b.isCapitol - a.isCapitol;
            }
        },
        array = [{ name: "Delhi", countryCode: "IN", isCapitol: true }, { name: "New York", countryCode: "USA", isCapitol: false }, { name: "Birmingham", countryCode: "UK", isCapitol: false }, { name: "London", countryCode: "UK", isCapitol: true }, { name: "Hyderabad", countryCode: "IN", isCapitol: false }, { name: "Chicago", countryCode: "USA", isCapitol: false }, { name: "Bristol", countryCode: "UK", isCapitol: false }, { name: "Washington", countryCode: "USA", isCapitol: true }];
    
    array.sort(sortByCountry('USA', 'UK', 'IN'));
    
    console.log(array);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 谢谢 Nina,很遗憾我们的工具不兼容 Es6。如果没有扩展运算符,我们能达到同样的效果吗?
    • 非常好.. 非常感谢!!!!!!!!!!!!!!!!!!!!!!!!
    【解决方案2】:

    您可以使用Array.prototype.sort() 方法来完成此操作,并通过创建一个排序数组对国家代码进行排序,然后按大写字母,最后按城市名称。

    const sortByCountry = (data, order) =>
      data.sort(
        (x, y) =>
          order.indexOf(x.countryCode) - order.indexOf(y.countryCode) ||
          y.isCapitol - x.isCapitol ||
          x.name.localeCompare(y.name)
      );
    const data = [
      {
        name: 'Delhi',
        countryCode: 'IN',
        isCapitol: true,
      },
      {
        name: 'New York',
        countryCode: 'USA',
        isCapitol: false,
      },
      {
        name: 'Birmingham',
        countryCode: 'UK',
        isCapitol: false,
      },
      {
        name: 'London',
        countryCode: 'UK',
        isCapitol: true,
      },
      {
        name: 'Hyderabad',
        countryCode: 'IN',
        isCapitol: false,
      },
      {
        name: 'Chicago',
        countryCode: 'USA',
        isCapitol: false,
      },
      {
        name: 'Bristol',
        countryCode: 'UK',
        isCapitol: false,
      },
      {
        name: 'Washington',
        countryCode: 'USA',
        isCapitol: true,
      },
    ];
    const order = ['IND', 'USA', 'UK'];
    console.log(sortByCountry(data, order));

    【讨论】:

    • 您好,hr 先生,您的代码正在运行,但国家/地区的顺序是自动降序,不在我们的控制范围内..它与我正在寻找的顺序巧合。换句话说,如果我希望订单是 IND、USA、UK
    • @HarishPuli 现在检查一下。它对你有用吗?请告诉我。我已经更新了代码。
    • 非常好.. 非常感谢!!!!!!!!!!!!!!!!!!!!!!!!
    【解决方案3】:

    为了对数组进行排序,可以使用:

    arr.sort([compareFunction])

    所以你必须编写一个自定义的 compareFunction

    compareFunction 比较数组的任意两个元素,如果第一个元素“更大”则返回 1,如果第一个元素“更小”则返回 -1

    arr.sort((a, b) => (a > b) ? 1 : -1)

    在这种情况下,我们的排序函数可以接收任意数量的参数,因此我们可以在 arguments 对象中访问它们。我们可以将arguments对象转换成一个数组,并使用indexOf函数来比较国家代码在数组中的位置。

    当国家代码相同时,我们检查其中一项是否为capitol。

    randomCities =
      [
             {
                 "name": "Delhi",
                 "countryCode": "IN",
                 "isCapitol": true
             },
             {
                 "name": "New York",
                 "countryCode": "USA",
                 "isCapitol": false
             },
             {
                 "name": "Birmingham",
                 "countryCode": "UK",
                 "isCapitol": false
             },
             {
                 "name": "London",
                 "countryCode": "UK",
                 "isCapitol": true
             },
             {
                 "name": "Hyderabad",
                 "countryCode": "IN",
                 "isCapitol": false
             },
             {
                 "name": "Chicago",
                 "countryCode": "USA",
                 "isCapitol": false
             },
             {
                 "name": "Bristol",
                 "countryCode": "UK",
                 "isCapitol": false
             },
             {
                 "name": "Washington",
                 "countryCode": "USA",
                 "isCapitol": true
             }
         ]
    
    function sortByCountry(){
      var args = Array.from(arguments);
      randomCities.sort( (a, b) => (args.indexOf(a.countryCode) == args.indexOf(b.countryCode)) ? (a.isCapitol ? -1 : 1) : ((args.indexOf(a.countryCode) > args.indexOf(b.countryCode)) ? 1 : -1));
      return randomCities;
    }
    
    sortyByCountry('USA', 'UK', 'IN');
    

    【讨论】:

    • 非常好.. 非常感谢!!!!!!!!!!!!!!!!!!!!!!!!
    猜你喜欢
    • 1970-01-01
    • 2014-06-20
    • 2020-05-16
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多