2016-08-24 25 views
1

下面的函數執行以下操作:修改下面的排序功能,所以它返回的數字

1)如果isDefault === trueisDefault === false,前者先行。

2)如果isDefault === trueisDefault === trueupdatedAt按降序排序。

3)如果isDefault === falseisDefault === false,按name按升序排序。

function sortPanoramas (panoramas) { 
    panoramas.sort((a, b) => { 
    if (a.isDefault !== b.isDefault) return a.isDefault < b.isDefault 
    if (a.isDefault && b.isDefault) return a.updatedAt < b.updatedAt 
    if (!a.isDefault && !b.isDefault) return a.name > b.name 
    }) 
} 

這個工作在Chrome,但不是在Safari瀏覽器,因爲有人告訴我,你應該在sort函數返回的數字。

如何修改函數使其返回數字?

編輯:樣本數據:

[ 
    { 
    "id": "CbU2Z5BZ9w", 
    "name": "a01", 
    "updatedAt": "2016-08-24T06:20:47.972Z", 
    "isDefault": true, 
    "index": 0 
    }, 
    { 
    "id": "RdT5CvGLRg", 
    "name": "a02", 
    "updatedAt": "2016-08-24T06:21:22.126Z", 
    "isDefault": false, 
    "index": 1 
    }, 
    { 
    "id": "eHyt1TYcBN", 
    "name": "a03", 
    "updatedAt": "2016-08-24T06:21:47.404Z", 
    "isDefault": false, 
    "index": 2 
    }, 
    { 
    "id": "jUTmyn2TDR", 
    "name": "a04", 
    "updatedAt": "2016-08-24T06:26:29.591Z", 
    "isDefault": false, 
    "index": 3 
    }, 
    { 
    "id": "VGXXNcBMcH", 
    "name": "a05", 
    "updatedAt": "2016-08-24T06:27:12.934Z", 
    "isDefault": false, 
    "index": 4 
    } 
] 
+2

看看[在JavaScript中排序:不應該返回一個布爾值足以比較函數?](http://stackoverflow.com/q/24080785/1048572) – Bergi

+0

@Nina Scholz好的,我添加了一些數據。 – alex

回答

2

我覺得這是你所需要的:

function sortPanoramas(panoramas) { 
    panoramas.sort((a, b) => { 
    if (a.isDefault !== b.isDefault) { 
     return a.isDefault ? -1 : 1; 
    } 
    if (a.isDefault && b.isDefault) { 
     return a.updatedAt > b.updatedAt ? -1 : a.updatedAt < b.updatedAt ? 1 : 0; 
    } 
    return a.name < b.name ? -1 : a.name > b.name ? 1 : 0; 
    }); 
} 
+1

有一點解釋,即使它只是代碼中的註釋,也會大大改善答案。 – slebetman

1

您需要根據您的布爾條件返回正數或負數。

function sortPanoramas (panoramas) { 
    var mapping = { true:1, false : -1} //example mapping 
    panoramas.sort((a, b) => { 
    if (a.isDefault !== b.isDefault) return mapping[a.isDefault < b.isDefault] 

    }) 
} 
2

你可以只鏈中的條件

function sortPanoramas(panoramas) { 
 
    panoramas.sort((a, b) => !a.isDefault - !b.isDefault || 
 
          a.isDefault && b.updatedAt.localeCompare(a.updatedAt) || 
 
          a.name.localeCompare(b.name)); 
 
} 
 

 
var data = [{ "id": "eHyt1TYcBN", "name": "a03", "updatedAt": "2016-08-24T06:21:47.404Z", "isDefault": false, "index": 2 }, { "id": "VGXXNcBMcH", "name": "a05", "updatedAt": "2016-08-24T06:27:12.934Z", "isDefault": false, "index": 4 }, { "id": "jUTmyn2TDR", "name": "a04", "updatedAt": "2016-08-24T06:26:29.591Z", "isDefault": false, "index": 3 }, { "id": "CbU2Z5BZ9w", "name": "a01", "updatedAt": "2016-08-24T06:20:47.972Z", "isDefault": true, "index": 0 }, { "id": "RdT5CvGLRg", "name": "a02", "updatedAt": "2016-08-24T06:21:22.126Z", "isDefault": false, "index": 1 }, ]; 
 

 
sortPanoramas(data); 
 
console.log(data);

0

在你的邏輯,你的狀態

1)如果ISDEFAULT ===真和ISDEFAULT = ==假,前者先去 。 2)如果isDefault === true並且isDefault === true,則按降序排列更新爲 。 3)如果isDefault === false並且isDefault === false,則按照 的名字按升序方式排序。

但是,如果這些匹配都不匹配,那麼您會發生什麼?即當a.isDefault === false && b.isDefault === true?不應該排序?

如果是這樣,那麼這可能是一個解決方案。

function sortPanoramas(panoramas) { 
    panoramas.sort((a, b) => { 
    if (a.isDefault) { 
     return b.isDefault ? a.updatedAt.localeCompare(b.updateAt) : -1; 
    } 
    return b.isDefault ? 0 : a.name.localeCompare(b.name); 
    }) 
} 

也許你可以澄清邏輯?