对包含数字和字符串的数组进行排序

时间:2018-12-28 12:11:27

标签: javascript arrays string ecmascript-6 numbers

我正在尝试对包含字符串,数字和数字作为字符串(例如'1','2')的数组进行排序。我想对该数组进行排序,以便排序后的数组首先包含数字,然后包含数字的字符串,最后包含字符串。

var arr = [9,5,'2','ab','3',-1 ] // to be sorted
arr.sort()
// arr = [-1, 5, 9, "2", "3","ab"] // expected result
//arr = [-1, "2", 5, 9, "ab"] // actual result

我也尝试过

var number =[];
var char =[];
arr.forEach(a=>{
 if(typeof a == 'number') number.push(a);
 else char.push(a);
})
arr = (number.sort((a,b)=> a>b)).concat(char.sort((a,b)=> a>b))
// arr = [-1, 5, 9, "2", "3","ab"] // expected result
//  arr = [-1, 5, 9, "2", "ab", "3"]// actual result

11 个答案:

答案 0 :(得分:19)

最短的可能是:

 arr.sort((a, b) => ((typeof b === "number") - (typeof a === "number")) || (a > b ? 1 : -1));

答案 1 :(得分:9)

您可以先使用HCERTSTORE certStore = CertOpenStore( CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_OPEN_EXISTING_FLAG, L"My" ); return CryptUIWizImport( CRYPTUI_WIZ_IMPORT_ALLOW_CERT | CRYPTUI_WIZ_IMPORT_TO_CURRENTUSER, nullptr, nullptr, nullptr, certStore ); 将两个数据类型分开,然后再对整数进行排序,然后对非整数进行排序。

请参见下面的工作示例(阅读代码注释以获取解释):

.filter()

答案 2 :(得分:3)

似乎您已完成第二次尝试的大部分工作。 我在这里所做的全部工作都是使用Array.concatnumberchar的排序结果结合在一起。

var arr = [9, 5, '2', 'ab', '3', -1] // to be sorted
var number = [];
var char = [];
arr.forEach(a => {
  if (typeof a == 'number') number.push(a);
  else char.push(a);
})


var sorted = number.sort().concat(char.sort());
console.log(sorted)

答案 3 :(得分:2)

您在这里!

const arr = [9,5,'2','ab','3',-1 ]

const numbers = arr.filter(i => typeof i === 'number');
const numerics = arr.filter(i => typeof i === 'string' && !isNaN(i));
const strings = arr.filter(i => typeof i === 'string' && isNaN(i));

numbers.sort();
numerics.sort();
strings.sort()

const result = [].concat(numbers, numerics, strings)

console.log(result)

我的策略是首先找到所有三个块(数字,数字和字符串),然后将它们封装在一起。

答案 4 :(得分:2)

我想更进一步,避免多次循环数组以降低复杂性并因此提高性能。

您可以执行一个自定义排序功能,在该函数中,您可以根据每个字符charCode的值计算字符串值,然后将它们和其他手部数字相加。

然后在此代码示例中,我使字符串值的幂为5,可以确保字符串值大于数字值。可以根据用例和您要处理的数据类型进行调整。

  

此方法的缺点是,性能会根据您处理字符串的时间长短而受到影响,因此请注意这一点。

var arr = [90000, 5, '2', 'ab', 'aa', '3', -1] // to be sorted
arr.sort((a,b) => {
  if(typeof a === 'string') {
    let temp = 0
    for (let s of a) temp += s.charCodeAt(0)
    a = Math.pow(temp, 5)
  }
  if(typeof b === 'string') {
    let temp = 0
    for(let s of b) temp += s.charCodeAt(0)
    b = Math.pow(temp, 5)
  }
  return a - b
})

console.log(arr) // [-1, 5, 90000, "2", "3", "aa", "ab"]

答案 5 :(得分:1)

尝试一下

const arr = [9, 5, '2', 'ab', '3', 'AB', -1];
const sortedArr = arr.sort((a, b) => {
    if (typeof a === 'number' && typeof b === 'number') {
        return a - b;
    } else if (typeof a === 'number') {
        return -1;
    } else if (typeof b === 'number') {
        return 1;
    } else {
        return a > b ? 1 : -1;
    }
});

console.log(sortedArr);

这使用Array.prototype.sort可选功能对一个数组中的元素进行排序。它必须返回一个数字。如果数字> 0,则b优先。如果数字<0,则a优先。如果为0,则它​​们的位置保持不变。

答案 6 :(得分:1)

尝试使用此:

var arr = [9, 5, '2', 'ab', '3', -1];
var number = [];
var strInt = [];
var char = [];
arr.forEach(a => {
  if (typeof a === "number") {
    number.push(a);
  } else if (typeof a === "string" && /\d/.test(a)) {
    strInt.push(a);
  } else {
    char.push(a);
  }
});
arr = number.concat(strInt.concat(char));
console.log(arr);

这是使三个数组组成,一个数组用于数字,一个数组用于包含数字的字符串,另一个数组用于字符串。它将每个元素排序到适当的数组中,然后最后以正确的顺序将它们全部串联在一起。

答案 7 :(得分:1)

您仍然可以使用Array .sort()方法。

您只需要提供一个功能即可控制每个比较的排序标准。

示例:

// First of all discretize all kinds of data you want to deal with
function typeClassify(v) {
    return typeof v == "number"
        ? "N"
        : isNaN(v) ? "s" : "n"
        // (Treat all non numeric values as strings)
    ;
};


// Second: implement the sorting function
function sortCriteria(a, b) {
    var mode = typeClassify(a) + typeClassify(b);
    switch (mode) {
        case "NN":
            return a - b;
        case "nn":
            return Number(a) - Number(b);
        case "ss":
            return a == b
                ? 0
                : a > b
                    ? -1 : 1
            ;
        case "Nn":
        case "Ns":
        case "ns":
            return -1;
        case "nN":
        case "sN":
        case "sn":
            return 1;
        default:
            throw "This must never happen";
    };
};

// And finally provide that function as a callback for .sort() method
var arr = [9,5,'2','ab','3',-1 ] // to be sorted
console.log(arr.sort(sortCriteria));

// arr = [-1, 5, 9, "2", "3","ab"] // expected result
// arr = [ -1, 5, 9, '2', '3', 'ab' ] // obtained result

很显然,typeClassify()函数的功能可以展平为sortCriteria()以在每次比较时保存函数调用。为了清楚起见,我倾向于将其分开。

答案 8 :(得分:1)

var arr=[9,5,'2','ab','3',-1];
    var string_arr=[];
    var number_arr=[];
    var string_number_arr=[];
    for(var i=0;i<arr.length;i++)
    {

        if(typeof(arr[i])=='number')
        {
            number_arr.push(arr[i]);

        }
        else if((Number(arr[i]).toString())=="NaN")
        {
            string_number_arr.push(arr[i]);

        }
        else
        {
            string_arr.push(arr[i]);
        }

    }
    string_arr.sort();
    number_arr.sort();
    string_number_arr.sort();
    var arr=number_arr.concat(string_arr,string_number_arr);
    console.log(arr);

答案 9 :(得分:1)

我们可以利用localeCompare函数内部的sort函数对数组进行排序

var items = [3, 'rob', 'peter', 43, 0, -222];
console.log(items.sort((a, b) => {
  return a.toString().localeCompare(b.toString());
}));

答案 10 :(得分:0)

var myArray = [9, 5, '2', 'ab', '3', -1]
myArray.sort((a, b) => {
  let aTest = /^\d+$/.test(a);
  let bTest = /^\d+$/.test(b);
  if (aTest && bTest) {
    return parseInt(a) - parseInt(b);
  } else if (aTest) {
    return -1;
  } else if (bTest) {
    return 1;
  } else {
    return a > b ? 1 : -1;
  }
})

console.log(myArray)