我有一个包含两个数组的对象变量
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];
怎么做?
答案 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;
});
如果要维护对象结构,最后可以执行此操作:
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);
}