Javascript按数字排序数组然后字符串和其他数组受影响

时间:2013-10-09 15:36:27

标签: javascript

我有一个包含两个数组的对象变量

var count = 200;

var display = {
   text: [5, 10, 25, 50, "All", 18],
   value: [5, 10, 25, 50, count, 18]
};

注意:在文本数组中键入的字符串将始终引用值数组中的count变量

我想首先按数字字符串对文本数组进行排序,但是值数组也会根据显示变量中的文本数组进行排序,因此在排序后它将是输出这样的东西:

display.text: [5, 10, 18, 25, 50, "All"];
display.value: [5, 10, 18, 25, 50, 200];

如果我使计数值减少,例如

count = 1; // change count to 1

它会显示类似这样的内容

display.text: [5, 10, 18, 25, 50, "All"];
display.value: [5, 10, 18, 25, 50, 1];

怎么做?

2 个答案:

答案 0 :(得分:2)

您可以使用map配对相应的数组项,然后sort。排序需要检查字符串类型以将其放在最后,并且常规数字比较将处理其余部分。

var result = display.text.map(function(x, i) {
    return { text: x, value: display.value[i] };
  }).sort(function(x, y) {
    return typeof x.text === "string" ? 1 : x.text - y.text;
  });

查看相同代码的JS Bin demo

答案 1 :(得分:0)

这样的东西?

var count = 200;
var display = {
   text: [5, 10, 25, 50, "All", 18],
   value: [5, 10, 25, 50, count, 18]
};

var array = [];
for(var i=0; i<display.text.length; i++) {
    array.push( { text: display.text[i], value: display.value[i] } );   
}

array = array.sort(function(a, b) {
    var aa = a.text, bb = b.text;
    if(typeof a.text == 'string' || a.text instanceof String) aa = +Infinity;
    if(typeof b.text == 'string' || b.text instanceof String) bb = +Infinity;
    return aa - bb;
});

Working demo

如果要维护对象结构,最后可以执行此操作:

var display_sorted = {
    text: [],
    value: []
};
for (var i = 0; i < array.length; i++) {
    display_sorted.text.push(array[i].text);
    display_sorted.value.push(array[i].value);
}

Working demo 2