JavaScript排序功能无法按预期工作

时间:2016-04-28 10:39:20

标签: javascript sorting

我正在尝试对数组进行排序:

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;

        }
    });
});

但我的数组根本没有排序。有谁知道为什么?

4 个答案:

答案 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)

您可以尝试计算排名,并根据排名,您可以对值进行排序:

逻辑:

  • 对于布尔值,如果为true,则在self中添加10并从其他位置删除10.
  • 对于其他人,您可以使用通用逻辑,在较大值中添加10,从较小值减少10。
  • 根据此排名排序。

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>")