转换&使用非数字键以数字方式排序javascript数组

时间:2017-06-07 12:28:59

标签: javascript jquery arrays sorting

我在以下结构中有一个JS数组:

Array(
    [0] => Array(
        reference : "8926"
        name : "xyz1"
        id_product : "78"
    )
    [1] => Array(
        reference : "11588"
        name : "xyz2"
        id_product : "21"
    )
    [2] => Array(
        reference : "119"
        name : "xyz3"
        id_product : "135"
    )
)

我需要使用reference键对此数组进行排序,我使用多重功能完成了它;

但问题是:即使reference是数字,但在数组结构中,它被定义为字符串,因此不是像以下那样排序: 119, 8926, 11588它将它排序为11588 119 8926,即像字符串一样。

我无法重新构造数组,因为我是通过API接收它的,无论如何要用数字对它进行排序而不必单独在数值数据类型中重新创建(因为我必须传递数组以相同的格式转发&因此双重转换将使剧本忙碌)?

PS - 使用this function.

完成当前排序(非数字)

5 个答案:

答案 0 :(得分:4)

您可以使用sort()函数内的unary plus + operator将两个参数从字符串转换为数字。



var data = [{"reference":"8926","name":"xyz1","id_product":"78"},{"reference":"11588","name":"xyz2","id_product":"21"},{"reference":"119","name":"xyz3","id_product":"135"}]

data.sort((a, b) => +a.reference - +b.reference);
console.log(data)




答案 1 :(得分:1)

试试这个:

let a = new Array(
    {
        reference : "8926",
        name : "xyz1",
        id_product : "78"
    },
    {
        reference : "11588",
        name : "xyz2",
        id_product : "21"
    },
    {
        reference : "119",
        name : "xyz3",
        id_product : "135"
    }
);

a.sort((a, b) => {
  return Number(a.reference) - Number(b.reference);
});

答案 2 :(得分:1)

我建议稍微升级使用过的库,以便将其与数值一起使用。

var x = is_numeric ? +a[columns[index]] : a[columns[index]].toLowerCase(); // <-- this line
var y = is_numeric ? +b[columns[index]] : b[columns[index]].toLowerCase(); // <-- this line
//                   ^ add this unary plus to get a numerical value istead of a string

&#13;
&#13;
var helper = {
    arr: {
        /**
    * Function to sort multidimensional array
    *
    * param {array} [arr] Source array
    * param {array} [columns] List of columns to sort
    * param {array} [order_by] List of directions (ASC, DESC)
    * returns {array}
    */
        multisort: function (arr, columns, order_by) {
            if (typeof columns == 'undefined') {
                columns = []
                for (x = 0; x < arr[0].length; x++) {
                    columns.push(x);
                }
            }

            if (typeof order_by == 'undefined') {
                order_by = []
                for (x = 0; x < arr[0].length; x++) {
                    order_by.push('ASC');
                }
            }

            function multisort_recursive(a, b, columns, order_by, index) {
                var direction = order_by[index] == 'DESC' ? 1 : 0;

                var is_numeric = !isNaN(a[columns[index]] - b[columns[index]]);

                var x = is_numeric ? +a[columns[index]] : a[columns[index]].toLowerCase(); // add plus
                var y = is_numeric ? +b[columns[index]] : b[columns[index]].toLowerCase(); // add plus
                //                   ^ add this unary plus to get a numerical value istead of a string

                if (!is_numeric) {
                    x = helper.string.to_ascii(a[columns[index]].toLowerCase(), -1),
                    y = helper.string.to_ascii(b[columns[index]].toLowerCase(), -1);
                }

                if (x < y) {
                    return direction == 0 ? -1 : 1;
                }

                if (x == y) {
                    return columns.length - 1 > index ? multisort_recursive(a, b, columns, order_by, index + 1) : 0;
                }

                return direction == 0 ? 1 : -1;
            }

            return arr.sort(function (a, b) {
                return multisort_recursive(a, b, columns, order_by, 0);
            });
        }
    }
};

var array = [{ reference: "8926", name: "xyz1", id_product: "78" }, { reference: "11588", name: "xyz2", id_product: "21" }, { reference: "119", name: "xyz3", id_product: "135" }];

console.log(helper.arr.multisort(array, ['reference'], ['ASC']));
console.log(helper.arr.multisort(array, ['reference'], ['DESC']));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 3 :(得分:0)

尝试使用parseFloat将字符串转换为数字。然后使用ASC订单进行排序

var Arr = [{"reference":"8926","name":"xyz1","id_product":"78"},{"reference":"11588","name":"xyz2","id_product":"21"},{"reference":"119","name":"xyz3","id_product":"135"}]

Arr.sort((a, b) => parseFloat(a.reference) - parseFloat(b.reference));
console.log(Arr)

答案 4 :(得分:-1)

你可以试试这个。

myArray.sort(function(a, b){
   return parseInt(a["reference"]) - parseInt(b["reference"]);
});