2

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

var count = 200;

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

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

我想先按数字对文本数组进行排序,然后是字符串,但是值数组也会根据显示变量中的文本数组受到影响,因此在排序后它将输出如下内容:

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];

怎么做?

4

2 回答 2

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 演示

于 2013-10-09T15:55:11.397 回答
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;
});

工作演示

如果要保留对象结构,最后可以这样做:

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);
}

工作演示 2

于 2013-10-09T15:53:16.987 回答