修改以下排序函数,使其返回数字

时间:2016-08-24 06:50:14

标签: javascript sorting

以下功能执行以下操作:

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

2)如果isDefault === trueisDefault === true,则按updatedAt降序排序。

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

4 个答案:

答案 0 :(得分: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 :(得分:2)

你可以链接条件

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 2 :(得分: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]

  })
}

答案 3 :(得分:0)

在你的逻辑中,你陈述

  

1)如果isDefault === true且isDefault === false,则前者继续   第一

     

2)如果isDefault === true且isDefault === true,则按updatedAt排序   以下降的方式。

     

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

也许你可以澄清逻辑?