尝试先按数字排序数组,然后按字母排序

时间:2017-03-08 14:53:40

标签: javascript arrays sorting

我正在尝试对数组进行排序。我试图按“itemCommodity”排序。我需要先按数字排序,然后按字母排序。例如:

1000 A120 B330 2020 J954 5000

应显示为:

1000 2020 5000 A120 B330 J954

我希望有人可以帮我解决这个问题。我有一个我在下面尝试的例子,但它没有按预期工作。

var product_data = [{
"itemCommodity": "1000",
},
{
"itemCommodity": "B330",
},
{
"itemCommodity": "A120",
},
{
"itemCommodity": "J954",
},
{
"itemCommodity": "5000",
},
{
"itemCommodity": "2020",
}]

 product_data.sort(function(a, b) {
     return a.itemCommodity - b.itemCommodity;
 });

请注意,itemCommodity不是数组中的唯一对象。我有大约40个不同的对象,只是试图对itemCommodity进行排序。

8 个答案:

答案 0 :(得分:4)

您可以尝试像这样比较它们

product_data.sort(function(a, b) {
     return a.itemCommodity > b.itemCommodity;
});

如果你想要对字母的顺序进行排序,那么你可以尝试这个

 product_data.sort(function(a, b) {
     return a.itemCommodity.toLowerCase() > b.itemCommodity.toLowerCase();
});

答案 1 :(得分:3)

首先对不包含任何字母的元素进行排序。然后 - 对其余部分进行排序,比较他们的第一个角色。

var product_data = [{a:"1000"},{a:"B330"},{a:"A120"},{a:"J954"},{a:"5000"},{a:"2020"}],
    x = product_data.sort(function(a, b) {
      return /[A-Za-z]/.test(a.a) - /[A-Za-z]/.test(b.a) || a.a.charCodeAt(0) - b.a.charCodeAt(0)
    });

    console.log(x);

如果您同时使用小写和大写字母,则必须将它们全部转换为一个相互大小写,然后对它们进行排序:

var product_data = [{a:"1000"},{a:"B330"},{a:"a120"},{a:"J954"},{a:"5000"},{a:"2020"}],
    x = product_data.sort(function(a, b) {
      return /[A-Za-z]/.test(a.a) - /[A-Za-z]/.test(b.a) || (a.a.toUpperCase() < b.a.toUpperCase() ? -1 : a.a.toUpperCase() > b.a.toUpperCase() ? 1 : 0)
    });

    console.log(x);

答案 2 :(得分:2)

因为,根据ASCII表格,首先是数字然后是字母表,您可以直接使用sort()方法对它们进行排序,如下所示;

["1000","A120","B330","2020", "J954", "5000"].sort()

结果

["1000", "2020", "5000", "A120", "B330", "J954"]

但是,由于您没有直接使用数组(在您的示例中给出),您可以迭代JSON的所有节点并直接比较它们;

"1000" > "A120" => false; "1000" < "A120" => true 

所以你的代码只有很小的修正;

    var product_data = [{
    "itemCommodity": "1000",
    },
    {
    "itemCommodity": "B330",
    },
    {
    "itemCommodity": "A120",
    },
    {
    "itemCommodity": "J954",
    },
    {
    "itemCommodity": "5000",
    },
    {
    "itemCommodity": "2020",
    }]
    
     product_data.sort(function(a, b) {
         return a.itemCommodity > b.itemCommodity;
     });
    
    console.log(product_data);

答案 3 :(得分:1)

我认为这就是你要找的东西。它有点冗长,但它完成了工作。假设您不知道对象的键是什么,这将基于它们的值对对象进行排序,而无需事先知道键。首先按升序对数字进行排序,然后按升序对字符串进行排序。您可以通过更改compare函数返回和sort函数返回数字来更改此顺序。

&#13;
&#13;
var numbersAlphAscending = (a, b) => {
  // get unknown keys
  var currentKeyA = Object.keys(a)[0];
  var currentKeyB = Object.keys(b)[0];
  
  // if item is a number
  if (Number(a[currentKeyA]) && Number(b.itemCommodity)) {
    return a[currentKeyA] - b[currentKeyB];
  }

  // if item is a string
  if (!Number(a[currentKeyA]) && !Number(b[currentKeyB])) {
    return a[currentKeyA].toLowerCase() > b[currentKeyB].toLowerCase();
  }

  // numbers before strings
  return Number(a[currentKeyA]) ? -1 : 1;

}

var product_data = [{"itemCommodity": "1000",},{"itemCommodity": "B330",},{"itemCommodity": "A120",},{"itemCommodity": "J954",},{"itemCommodity": "5000",},{"itemCommodity": "2020",}]

console.log(product_data.sort(numbersAlphAscending));
&#13;
&#13;
&#13;

答案 4 :(得分:1)

您可以使用map创建数组并使用sort对其进行排序。

      var numArray = [];
    var product_data = [{
    "itemCommodity": "1000",
    },
    {
    "itemCommodity": "B330",
    },
    {
    "itemCommodity": "A120",
    },
    {
    "itemCommodity": "J954",
    },
    {
    "itemCommodity": "5000",
    },
    {
    "itemCommodity": "2020",
    }]


     product_data.map(function(value, index) {
       numArray.push(value["itemCommodity"]); 
    })

        numArray.sort();
        var newNum=(numArray.join(","));
        alert(newNum);

答案 5 :(得分:0)

为了在JS中对数组进行排序,您所描述的是默认行为。

var myArray = ["123","A123","345","C123","B123"]
myArray.sort();
console.log(myArray);

虽然对于关联数组,您可能需要查看此帖子:

How to sort an associative array by its values in Javascript?

答案 6 :(得分:0)

  1. reduce将数组分成两个数组 - 一个没有字母,另一个没有 用字母
  2. 对每个数组的顺序进行排序
  3. 最后,将两个排序的数组连接在一起
  4. var product_data = [
    	{ "itemCommodity": "1000" },
    	{ "itemCommodity": "B330" },
    	{ "itemCommodity": "A120" },
    	{ "itemCommodity": "J954" },
    	{ "itemCommodity": "5000" },
    	{ "itemCommodity": "2020" }
    ];
    
    product_data
      // We reduce into two array - one without letters, another with letters
      .reduce((arr, record) => {
        const index = (record.itemCommodity.match(/[a-z]/i)) ? 1 : 0;
        arr[index].push(record);
        return arr;
      }, [[],[]])
      // We sort the two array respectively
      .map((arr) => arr.sort((a,b) => a.itemCommodity > b.itemCommodity))
      // We concat the two sorted array
      .reduce((curr, next) => curr.concat(next));
    
    console.log(product_data);

答案 7 :(得分:0)

仅当两个值都不都是数字时,才可以尝试这种基于字符串的比较技巧,否则请使用数字排序。

cast