【问题标题】:Ordering JS Data订购 JS 数据
【发布时间】:2021-07-11 04:19:58
【问题描述】:

所以我有一些数据:

const unorderedData = [
  {checklistIndex: 1, id: 1532, isDone: true, taskName: "Task 3", tasksKey: "2Task 3"},
  {checklistIndex: 2, id: 3969, isDone: false, taskName: "Task 1", tasksKey: "0Task 1"},
  {checklistIndex: 3, id: 561, isDone: true, taskName: "Task 2", tasksKey: "1Task 2"},
  {checklistIndex: 4, id: 6270, isDone: false, taskName: "Task 4", tasksKey: "3Task 4"},
  {checklistIndex: 5, id: 2151, isDone: true, taskName: "Task 3", tasksKey: "2Task 3"},
  {checklistIndex: 6, id: 7776, isDone: false, taskName: "Task 5", tasksKey: "4Task 5"},
  {checklistIndex: 7, id: 689, isDone: false, taskName: "Task 5", tasksKey: "4Task 5"}
];

我想订购它们
isDone === true 任务应该从 1 到它的长度排序,
所有 isDone === false 任务应该从 isDonelength 到 isNotDoneLenght 排序。
所以数据应该从无序数据变成这样:

const correctAnswer = [
  {checklistIndex: 4, id: 3969, isDone: false, taskName: "Task 1", tasksKey: "0Task 1"},
  {checklistIndex: 5, id: 6270, isDone: false, taskName: "Task 4", tasksKey: "3Task 4"},
  {checklistIndex: 6, id: 7776, isDone: false, taskName: "Task 5", tasksKey: "4Task 5"},
  {checklistIndex: 7, id: 689, isDone: false, taskName: "Task 5", tasksKey: "4Task 5"},
  {checklistIndex: 1, id: 1532, isDone: true, taskName: "Task 3", tasksKey: "2Task 3"},
  {checklistIndex: 2, id: 561, isDone: true, taskName: "Task 2", tasksKey: "1Task 2"},
  {checklistIndex: 3, id: 2151, isDone: true, taskName: "Task 3", tasksKey: "2Task 3"}
];

这是我的功能:

const fixData = (dataToOrder) => {
  let fixedData = []

  let doneSelectedTasks = dataToOrder.filter(itemData => itemData.isDone);
  let notDoneSelectedTasks = dataToOrder.filter(itemData => !itemData.isDone)

  let fixedDoneTasks = doneSelectedTasks.map((itemData, index) => {
    let newItemData = itemData;
    newItemData.checklistIndex = index+1;
    return newItemData;
  })

  let indexForUnfinishedSelectedTasks = fixedDoneTasks.length+1;
  console.log(indexForUnfinishedSelectedTasks)
  let fixedNotDoneTasks = notDoneSelectedTasks.map((itemData) => {
    let newItemData = itemData;
    newItemData.checklistIndex = indexForUnfinishedSelectedTasks;
    indexForUnfinishedSelectedTasks += 1;
    return newItemData;
  })

  fixedData = fixedNotDoneTasks.concat(fixedDoneTasks);
  return fixedData
}

现在使用这个函数我得到了这个结果

[
  {checklistIndex: 4, id: 3969, isDone: false, taskName: 'Task 1', tasksKey: '0Task 1'},
  {checklistIndex: 5, id: 6270, isDone: false, taskName: 'Task 4', tasksKey: '3Task 4'},
  {checklistIndex: 6, id: 7776, isDone: false, taskName: 'Task 5', tasksKey: '4Task 5'},
  {checklistIndex: 7, id: 689, isDone: false, taskName: 'Task 5', tasksKey: '4Task 5'},
  {checklistIndex: 1, id: 1532, isDone: true, taskName: 'Task 3', tasksKey: '2Task 3'},
  {checklistIndex: 2, id: 561, isDone: true, taskName: 'Task 2', tasksKey: '1Task 2'},
  {checklistIndex: 3, id: 2151, isDone: true, taskName: 'Task 3', tasksKey: '2Task 3'}
]

这显然是错误的,谁能告诉我为什么。是我眼睛不好还是我的代码有问题

【问题讨论】:

  • 函数的输出等于您自己定义的预期输出。我不确定我是否理解问题所在。
  • "isDone === false 任务从 isDonelength 排序到 isNotDoneLenght"。 isDonelength 是什么?
  • "which apperantly is wrong" 是被某个在线编码网站或你的老师拒绝了吗?预期的输出和你的输出是一样的。
  • 此代码的唯一问题是let newItemData = itemData 不会创建数据副本。它仍然会改变原始对象。您可以使用:let newItemData = { ...itemData }
  • @adiga Iment isDone === trues 过滤列表长度我知道我会尝试并回复。这也是一个反应原生项目,但我现在正在研究这部分,这实际上是我自己的问题

标签: javascript node.js arrays sorting


【解决方案1】:

你可以试试这个方法:

const data = [
  {checklistIndex: 4, id: 3969, isDone: false, taskName: 'Task 1', tasksKey: '0Task 1'},
  {checklistIndex: 5, id: 6270, isDone: false, taskName: 'Task 4', tasksKey: '3Task 4'},
  {checklistIndex: 6, id: 7776, isDone: false, taskName: 'Task 5', tasksKey: '4Task 5'},
  {checklistIndex: 7, id: 689, isDone: false, taskName: 'Task 5', tasksKey: '4Task 5'},
  {checklistIndex: 1, id: 1532, isDone: true, taskName: 'Task 3', tasksKey: '2Task 3'},
  {checklistIndex: 2, id: 561, isDone: true, taskName: 'Task 2', tasksKey: '1Task 2'},
  {checklistIndex: 3, id: 2151, isDone: true, taskName: 'Task 3', tasksKey: '2Task 3'}
]
const isDone = data.filter(a => a.isDone === true)
const rest = data.filter(a => a.isDone === false)
isDone.sort(function(a, b) {
  return a.checklistIndex - b.checklistIndex;
});
rest.sort(function(a, b) {
  return a.checklistIndex - b.checklistIndex;
});
console.log(isDone.concat(rest));

【讨论】:

  • 您好@Theadore 感谢您的回答,但我只是一个问题。一个是我的数据 true 和 false 不会已经按顺序设置它会有所不同所以如果我使用这个代码我不相信它会起作用,因为我需要将所有项目的清单索引值从 true 放入oneBases 索引中的错误,但感谢您尝试
猜你喜欢
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 2018-09-24
  • 2019-07-18
  • 1970-01-01
  • 2020-01-28
  • 2011-08-03
相关资源
最近更新 更多