我正在尝试对数组进行排序:
var mapped = [{
wiFi: true,
megapixel: '20 MP'
},{
wiFi: false,
megapixel: '25 MP'
},{
wiFi: true,
megapixel: '25 MP'
},{
wiFi: true,
megapixel: '21 MP'
}];
我想在两个属性上进行排序(首先是wiFi)。这是我正在做的一个非常简单的版本,但属性可以由用户决定,所以我有一个看起来有点像这样的函数:
var fields = ['wiFi', 'megapixel'];
// Sort our mapped array
mapped.sort(function (a, b) {
// Loop through our properties
fields.forEach(function (field) {
// Get our value (skip the first)
var x = a[field.name];
var y = b[field.name];
// Switch on the type
switch (typeof x) {
// Boolean
case "boolean":
// Return our value
return x === y ? 0 : x ? -1 : 1;
// Default
default:
// Return our value
return x === y ? 0 : x < y ? -1 : 1;
}
});
});
但我的数组根本没有排序。有谁知道为什么?
答案 0 :(得分:1)
尝试手动迭代而不是使用内部函数的迭代。
mapped.sort(function(a,b) {
var x, y, i, l = fields.length;
for( i=0; i<l; i++) {
x = a[fields[i]];
y = b[fields[i]];
if( x === y) continue; // proceed to next field to compare
switch(typeof x) {
case "boolean":
return x ? -1 : 1;
// could do other things, eg. case "string": return x.localeCompare(y);
default:
return x < y ? -1 : 1;
}
}
return 0; // all fields compared equal
});
答案 1 :(得分:0)
感谢你的所有建议,我试图将它们全部结合起来并提出来:
// Sort our mapped array
mapped.sort(function (a, b) {
// Loop through our properties
for (var i = 0; i < fields.length; i++) {
// Get our field
var field = fields[i];
// Get our value (skip the first)
var x = a[field.name];
var y = b[field.name];
// If our values are the same, go to the next compare
if (x === y)
continue;
// Switch on the type
switch (field.type) {
// Boolean
case "boolean":
// Return our value
return x ? -1 : 1;
// Integer
case "float":
// Update our values
x = parseFloat(x);
y = parseFloat(y);
// Return our value
return x < y ? -1 : 1;
// Default (string)
default:
// Return our value
return x.localeCompare(y);
}
}
答案 2 :(得分:0)
您可以对辅助对象使用sort。
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/linearLayout1">
<TextView
android:text="@string/please_choose_an_area"
android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/textView2"
android:textSize="20sp"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="15dp" />
<CheckBox
android:text="All"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/checkBox1"
android:layout_marginRight="15dp" />
</LinearLayout>
答案 3 :(得分:0)
您可以尝试计算排名,并根据排名,您可以对值进行排序:
var mapped = [{ wiFi: true, megapixel: '20 MP'}, { wiFi: false, megapixel: '25 MP'}, { wiFi: true, megapixel: '25 MP'}, { wiFi: true, megapixel: '21 MP'}];
var fields = ['wiFi', 'megapixel'];
// Sort our mapped array
mapped.sort(function(a, b) {
var a_rank = 0;
var b_rank = 0;
// Loop through our properties
fields.forEach(function(field) {
// Get our value (skip the first)
var x = a[field];
var y = b[field];
// Switch on the type
switch (typeof x) {
// Boolean
case "boolean":
a_rank += x ? -10 : 10;
b_rank += y ? -10 : 10;
break;
// Default
default:
if (x > y) {
a_rank += 10;
b_rank -= 10;
} else if (y > x) {
a_rank -= 10;
b_rank += 10
}
break;
}
});
return a_rank > b_rank ? 1 : a_rank < b_rank ? -1 : 0
});
document.write("<pre>" + JSON.stringify(mapped,0,4)+ "</pre>")