如何根据内部数组中的值对嵌套数组进行排序?

How to sort nested array depending on values in the inner array?

我有一组待办事项列表,其中包含一组任务。我现在需要根据内部数组的值对数组进行排序。我希望数组首先按 important 属性的最高优先级排序。然后删除所有具有 dueDateTime (如果存在) 且早于今天的待办事项(因为 Microsoft Graph API returns 中的所有任务单独的待办事项列表,并且不排除较旧的任务)。不应该从数组中删除没有 dueDateTime 的待办事项。现有值应按 dueDateTime 值排序。

如何在 JavaScript 中实现此目的?

这是我的 array,其中包含 Microsoft Graph API returns:[=19 的所有任务=]

    let todos =    [{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('f7dec6a0-3f91-43e2-8a28-d6de2f238caa')/todo/lists('AQMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OAAALgAAA7JK6Wv8LyFEhk0vxTmAtLMBANEaHwdeaklLnbQ6yUS32Z0AAAIBEgAAAA%3D%3D')/tasks",
    "value": [{
        "@odata.etag": "W/\"0RofB15qSUudtDrJRLfZnQAABbfP5Q==\"",
        "importance": "normal",
        "isReminderOn": false,
        "status": "notStarted",
        "title": "test12341241241241451",
        "createdDateTime": "2021-11-10T09:20:54.6522448Z",
        "lastModifiedDateTime": "2021-11-12T06:23:04.4839213Z",
        "id": "AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OABGAAAAAACySulr-C8hRIZNL8U5gLSzBwDRGh8HXmpJS520OslEt9mdAAAAAAESAADRGh8HXmpJS520OslEt9mdAAADfurHAAA=",
        "body": {
            "content": "",
            "contentType": "text"
        },
        "dueDateTime": {
            "dateTime": "2021-11-12T23:00:00.0000000",
            "timeZone": "UTC"
        }
    }, {
        "@odata.etag": "W/\"0RofB15qSUudtDrJRLfZnQAABbefnQ==\"",
        "importance": "high",
        "isReminderOn": false,
        "status": "notStarted",
        "title": "test 1231551515155",
        "createdDateTime": "2021-11-10T09:20:51.5538432Z",
        "lastModifiedDateTime": "2021-11-11T09:19:14.5876034Z",
        "id": "AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OABGAAAAAACySulr-C8hRIZNL8U5gLSzBwDRGh8HXmpJS520OslEt9mdAAAAAAESAADRGh8HXmpJS520OslEt9mdAAADfurGAAA=",
        "body": {
            "content": "",
            "contentType": "text"
        },
        "dueDateTime": {
            "dateTime": "2021-11-10T23:00:00.0000000",
            "timeZone": "UTC"
        }
    }]
}, {
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('f7dec6a0-3f91-43e2-8a28-d6de2f238caa')/todo/lists('AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OAAuAAAAAACySulr-C8hRIZNL8U5gLSzAQDRGh8HXmpJS520OslEt9mdAAADfg5CAAA%3D')/tasks",
    "value": [{
        "@odata.etag": "W/\"0RofB15qSUudtDrJRLfZnQAABbeZZg==\"",
        "importance": "normal",
        "isReminderOn": false,
        "status": "notStarted",
        "title": "test test testtest test testtest test testtest test testtest test testtest test testtest test test'",
        "createdDateTime": "2021-11-11T06:55:42.8810298Z",
        "lastModifiedDateTime": "2021-11-11T07:05:43.9657845Z",
        "id": "AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OABGAAAAAACySulr-C8hRIZNL8U5gLSzBwDRGh8HXmpJS520OslEt9mdAAADfg5CAADRGh8HXmpJS520OslEt9mdAAAFujyNAAA=",
        "body": {
            "content": "",
            "contentType": "text"
        }
    }, {
        "@odata.etag": "W/\"0RofB15qSUudtDrJRLfZnQAABbeZZA==\"",
        "importance": "normal",
        "isReminderOn": false,
        "status": "notStarted",
        "title": "test test testtest test testtest test testtest test test",
        "createdDateTime": "2021-11-11T06:55:40.2346649Z",
        "lastModifiedDateTime": "2021-11-11T07:05:41.8202032Z",
        "id": "AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OABGAAAAAACySulr-C8hRIZNL8U5gLSzBwDRGh8HXmpJS520OslEt9mdAAADfg5CAADRGh8HXmpJS520OslEt9mdAAAFujyMAAA=",
        "body": {
            "content": "",
            "contentType": "text"
        }
    }, {
        "@odata.etag": "W/\"0RofB15qSUudtDrJRLfZnQAABbeflQ==\"",
        "importance": "normal",
        "isReminderOn": false,
        "status": "notStarted",
        "title": "detta är ett test",
        "createdDateTime": "2021-11-11T06:55:30.6219299Z",
        "lastModifiedDateTime": "2021-11-11T09:19:13.9912155Z",
        "id": "AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OABGAAAAAACySulr-C8hRIZNL8U5gLSzBwDRGh8HXmpJS520OslEt9mdAAADfg5CAADRGh8HXmpJS520OslEt9mdAAAFujyLAAA=",
        "body": {
            "content": "",
            "contentType": "text"
        }
    }, {
        "@odata.etag": "W/\"0RofB15qSUudtDrJRLfZnQAABbeflw==\"",
        "importance": "normal",
        "isReminderOn": false,
        "status": "notStarted",
        "title": "Testar filips lista",
        "createdDateTime": "2021-11-10T09:21:52.9503933Z",
        "lastModifiedDateTime": "2021-11-11T09:19:14.1395668Z",
        "id": "AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OABGAAAAAACySulr-C8hRIZNL8U5gLSzBwDRGh8HXmpJS520OslEt9mdAAADfg5CAADRGh8HXmpJS520OslEt9mdAAADfvKlAAA=",
        "body": {
            "content": "",
            "contentType": "text"
        }
    }]
}, {
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('f7dec6a0-3f91-43e2-8a28-d6de2f238caa')/todo/lists('AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OAAuAAAAAACySulr-C8hRIZNL8U5gLSzAQDRGh8HXmpJS520OslEt9mdAAADfg5BAAA%3D')/tasks",
    "value": [{
        "@odata.etag": "W/\"0RofB15qSUudtDrJRLfZnQAABbefmQ==\"",
        "importance": "normal",
        "isReminderOn": false,
        "status": "notStarted",
        "title": "Detta är ett test i test",
        "createdDateTime": "2021-11-10T09:21:45.376632Z",
        "lastModifiedDateTime": "2021-11-11T09:19:14.2918996Z",
        "id": "AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OABGAAAAAACySulr-C8hRIZNL8U5gLSzBwDRGh8HXmpJS520OslEt9mdAAADfg5BAADRGh8HXmpJS520OslEt9mdAAADfu66AAA=",
        "body": {
            "content": "",
            "contentType": "text"
        }
    }]
}];

更新:

我尝试了@Tom 的第一个答案代码并得到了错误:

"Uncaught TypeError: item.dueDateTime.dateTime.getTime is not a function",

我也尝试过使用 new Date (item.dueDateTime.dateTime) 将其转换为有效的日期格式,但没有成功..

更新 2

我尝试了答案更新代码,但出现错误:

"Uncaught TypeError: Cannot read properties of undefined (reading 'dateTime')"

let todos =    [{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('f7dec6a0-3f91-43e2-8a28-d6de2f238caa')/todo/lists('AQMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OAAALgAAA7JK6Wv8LyFEhk0vxTmAtLMBANEaHwdeaklLnbQ6yUS32Z0AAAIBEgAAAA%3D%3D')/tasks",
    "value": [{
        "@odata.etag": "W/\"0RofB15qSUudtDrJRLfZnQAABbfP5Q==\"",
        "importance": "normal",
        "isReminderOn": false,
        "status": "notStarted",
        "title": "test12341241241241451",
        "createdDateTime": "2021-11-10T09:20:54.6522448Z",
        "lastModifiedDateTime": "2021-11-12T06:23:04.4839213Z",
        "id": "AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OABGAAAAAACySulr-C8hRIZNL8U5gLSzBwDRGh8HXmpJS520OslEt9mdAAAAAAESAADRGh8HXmpJS520OslEt9mdAAADfurHAAA=",
        "body": {
            "content": "",
            "contentType": "text"
        },
        "dueDateTime": {
            "dateTime": "2021-11-12T23:00:00.0000000",
            "timeZone": "UTC"
        }
    }, {
        "@odata.etag": "W/\"0RofB15qSUudtDrJRLfZnQAABbefnQ==\"",
        "importance": "high",
        "isReminderOn": false,
        "status": "notStarted",
        "title": "test 1231551515155",
        "createdDateTime": "2021-11-10T09:20:51.5538432Z",
        "lastModifiedDateTime": "2021-11-11T09:19:14.5876034Z",
        "id": "AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OABGAAAAAACySulr-C8hRIZNL8U5gLSzBwDRGh8HXmpJS520OslEt9mdAAAAAAESAADRGh8HXmpJS520OslEt9mdAAADfurGAAA=",
        "body": {
            "content": "",
            "contentType": "text"
        },
        "dueDateTime": {
            "dateTime": "2021-11-10T23:00:00.0000000",
            "timeZone": "UTC"
        }
    }]
}, {
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('f7dec6a0-3f91-43e2-8a28-d6de2f238caa')/todo/lists('AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OAAuAAAAAACySulr-C8hRIZNL8U5gLSzAQDRGh8HXmpJS520OslEt9mdAAADfg5CAAA%3D')/tasks",
    "value": [{
        "@odata.etag": "W/\"0RofB15qSUudtDrJRLfZnQAABbeZZg==\"",
        "importance": "normal",
        "isReminderOn": false,
        "status": "notStarted",
        "title": "test test testtest test testtest test testtest test testtest test testtest test testtest test test'",
        "createdDateTime": "2021-11-11T06:55:42.8810298Z",
        "lastModifiedDateTime": "2021-11-11T07:05:43.9657845Z",
        "id": "AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OABGAAAAAACySulr-C8hRIZNL8U5gLSzBwDRGh8HXmpJS520OslEt9mdAAADfg5CAADRGh8HXmpJS520OslEt9mdAAAFujyNAAA=",
        "body": {
            "content": "",
            "contentType": "text"
        }
    }, {
        "@odata.etag": "W/\"0RofB15qSUudtDrJRLfZnQAABbeZZA==\"",
        "importance": "normal",
        "isReminderOn": false,
        "status": "notStarted",
        "title": "test test testtest test testtest test testtest test test",
        "createdDateTime": "2021-11-11T06:55:40.2346649Z",
        "lastModifiedDateTime": "2021-11-11T07:05:41.8202032Z",
        "id": "AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OABGAAAAAACySulr-C8hRIZNL8U5gLSzBwDRGh8HXmpJS520OslEt9mdAAADfg5CAADRGh8HXmpJS520OslEt9mdAAAFujyMAAA=",
        "body": {
            "content": "",
            "contentType": "text"
        }
    }, {
        "@odata.etag": "W/\"0RofB15qSUudtDrJRLfZnQAABbeflQ==\"",
        "importance": "normal",
        "isReminderOn": false,
        "status": "notStarted",
        "title": "detta är ett test",
        "createdDateTime": "2021-11-11T06:55:30.6219299Z",
        "lastModifiedDateTime": "2021-11-11T09:19:13.9912155Z",
        "id": "AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OABGAAAAAACySulr-C8hRIZNL8U5gLSzBwDRGh8HXmpJS520OslEt9mdAAADfg5CAADRGh8HXmpJS520OslEt9mdAAAFujyLAAA=",
        "body": {
            "content": "",
            "contentType": "text"
        }
    }, {
        "@odata.etag": "W/\"0RofB15qSUudtDrJRLfZnQAABbeflw==\"",
        "importance": "normal",
        "isReminderOn": false,
        "status": "notStarted",
        "title": "Testar filips lista",
        "createdDateTime": "2021-11-10T09:21:52.9503933Z",
        "lastModifiedDateTime": "2021-11-11T09:19:14.1395668Z",
        "id": "AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OABGAAAAAACySulr-C8hRIZNL8U5gLSzBwDRGh8HXmpJS520OslEt9mdAAADfg5CAADRGh8HXmpJS520OslEt9mdAAADfvKlAAA=",
        "body": {
            "content": "",
            "contentType": "text"
        }
    }]
}, {
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('f7dec6a0-3f91-43e2-8a28-d6de2f238caa')/todo/lists('AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OAAuAAAAAACySulr-C8hRIZNL8U5gLSzAQDRGh8HXmpJS520OslEt9mdAAADfg5BAAA%3D')/tasks",
    "value": [{
        "@odata.etag": "W/\"0RofB15qSUudtDrJRLfZnQAABbefmQ==\"",
        "importance": "normal",
        "isReminderOn": false,
        "status": "notStarted",
        "title": "Detta är ett test i test",
        "createdDateTime": "2021-11-10T09:21:45.376632Z",
        "lastModifiedDateTime": "2021-11-11T09:19:14.2918996Z",
        "id": "AAMkAGU0Yjc1Y2U4LWE3ODYtNGE3YS04ZjVlLTQxYjlmNDZkYWM4OABGAAAAAACySulr-C8hRIZNL8U5gLSzBwDRGh8HXmpJS520OslEt9mdAAADfg5BAADRGh8HXmpJS520OslEt9mdAAADfu66AAA=",
        "body": {
            "content": "",
            "contentType": "text"
        }
    }]
}];

let newArray = [];

// flatten the array so we can use Array.sort()
todos.forEach(list => {
  list.value.forEach(item => {
    newArray.push(item);
  })
});

// filter out anything older than 1 day
newArray = newArray.filter((item) => {
  return new Date(item.dueDateTime.dateTime).getTime() + 86400000 < new Date().getTime(); // 8.64 million = 1 day
});

// sort the array
newArray = newArray.sort((a, b) => {
  // convert importance to numbers so we can compare
  const aScore = a.importance === 'high' ? 1 : 0;
  const bScore = b.importance === 'high' ? 1 : 0;
  // sorts by importance. If the importances are equal a-b is 0, so
  // instead we sort by dates, putting the lowest first
  return aScore - bScore || !b.dueDateTime ? 1 : !a.dueDateTime ? -1 : new Date(b.dueDateTime.dateTime).getTime() - new Date(a.dueDateTime.dateTime).getTime();
});

您可能更容易先展平数组,然后 运行 在其上使用排序函数。

let newArray = [];

// flatten the array so we can use Array.sort()
todos.forEach((list) => {
  list.forEach((item) => {
    newArray.push(item);
  }
}

// filter out anything older than 1 day
newArray = newArray.filter((item) => {
  return !item.dueDateTime || new Date(item.dueDateTime.dateTime).getTime() + 86400000 < new Date().getTime(); // 8.64 million = 1 day
});

// sort the array
newArray = newArray.sort((a, b) => {
  // convert importance to numbers so we can compare
  const aScore = a.importance === 'high' ? 1 : 0;
  const bScore = b.importance === 'high' ? 1 : 0;
  // sorts by importance. If the importances are equal a-b is 0, so
  // instead we sort by dates, putting the lowest first
  return aScore - bScore || !b.dueDateTime ? 1 : !a.dueDateTime ? -1 : new Date(b.dueDateTime.dateTime).getTime() - new Date(a.dueDateTime.dateTime).getTime();
});