比较和删除 javascript 数组中的值

我有一个数组,里面有一堆对象。一个对象的“endTime”值有时大于前一个对象的“endTime”值。我在数组的第二个对象中添加了一个示例。


[

  { 

    title: 'Title 1',

    startTime: '2019-09-26T06:00:00+0100',

    endTime: '2019-09-26T08:30:00+0100' 

  },

  { 

    title: 'Title 2',

    startTime: '2019-09-26T08:00:00+0100',

    endTime: '2019-09-26T08:15:00+0100' 

  },

  { 

    title: 'Title 3',

    startTime: '2019-09-26T08:30:00+0100',

    endTime: '2019-09-26T09:25:00+0100' 

  },

  { 

    title: 'Title 4',

    startTime: '2019-09-26T09:25:00+0100',

    endTime: '2019-09-26T10:25:00+0100' 

  },

  { 

    title: 'Title 5',

    startTime: '2019-09-26T10:25:00+0100',

    endTime: '2019-09-26T11:00:00+0100' 

  }

]

'endTime' 应该按时间顺序排列,并且 '8:15' 永远不应该在数组中的 '8:30' 之后。我希望在“endTime”值小于之前的值时进行检查,然后将其从数组中删除。任何帮助,将不胜感激。谢谢


德玛西亚99
浏览 156回答 3
3回答

慕莱坞森

这里有两种方法。第一个返回数组,其中项目仅与数组中的前一个对象进行比较。第二个将该项与数组中当前项之前的所有对象进行比较。const data = [{    title: 'Title 1',    startTime: '2019-09-26T06:00:00+0100',    endTime: '2019-09-26T08:30:00+0100'  },  {    title: 'Title 2',    startTime: '2019-09-26T08:00:00+0100',    endTime: '2019-09-26T08:15:00+0100'  },  {    title: 'Title 3',    startTime: '2019-09-26T08:30:00+0100',    endTime: '2019-09-26T09:25:00+0100'  },  {    title: 'Title 4',    startTime: '2019-09-26T09:25:00+0100',    endTime: '2019-09-26T10:25:00+0100'  },  {    title: 'Title 5',    startTime: '2019-09-26T10:25:00+0100',    endTime: '2019-09-26T11:00:00+0100'  }].map(item => {  item.startTime = new Date(item.startTime)  item.endTime = new Date(item.endTime)  return item})const greaterThanLast = data.filter((item, index) => {  const last = data[index - 1]  if (typeof last == 'undefined') return true  return item.endTime > last.endTime})const greaterThanAll = data.reduce((result, current) => {  const endTimeGreaterThanRest = result.every((item) => current.endTime > item.endTime)  if (endTimeGreaterThanRest) result.push(current)  return result}, [])console.log(greaterThanLast)console.log(greaterThanAll)

慕田峪4524236

假设您不想更改原始数组并假设您想删除“最低”值,您可以执行单个 for 循环:跟踪以前的值。将前一个值与当前值进行比较。根据您的需要过滤该值。关于代码的注释直接在下面,这个解决方案意味着只循环一次原始数组,利用单个 for-of 循环。const input = [&nbsp; {&nbsp;&nbsp; &nbsp; title: 'Title 1',&nbsp; &nbsp; startTime: '2019-09-26T06:00:00+0100',&nbsp; &nbsp; endTime: '2019-09-26T08:30:00+0100'&nbsp;&nbsp; },&nbsp; {&nbsp;&nbsp; &nbsp; title: 'Title 2',&nbsp; &nbsp; startTime: '2019-09-26T08:00:00+0100',&nbsp; &nbsp; endTime: '2019-09-26T08:15:00+0100'&nbsp;&nbsp; },&nbsp; {&nbsp;&nbsp; &nbsp; title: 'Title 3',&nbsp; &nbsp; startTime: '2019-09-26T08:30:00+0100',&nbsp; &nbsp; endTime: '2019-09-26T09:25:00+0100'&nbsp;&nbsp; },&nbsp; {&nbsp;&nbsp; &nbsp; title: 'Title 4',&nbsp; &nbsp; startTime: '2019-09-26T09:25:00+0100',&nbsp; &nbsp; endTime: '2019-09-26T10:25:00+0100'&nbsp;&nbsp; },&nbsp; {&nbsp;&nbsp; &nbsp; title: 'Title 5',&nbsp; &nbsp; startTime: '2019-09-26T10:25:00+0100',&nbsp; &nbsp; endTime: '2019-09-26T11:00:00+0100'&nbsp;&nbsp; }];function fixChronologicalItems(arr) {&nbsp; // Keep track of the previous item.&nbsp; let res = [], previous;&nbsp; // Iterate all the items of the array.&nbsp; for (let i = 0; i < arr.length; i++) {&nbsp; &nbsp; // assume the current item is the looped one.&nbsp; &nbsp; let item = arr[i];&nbsp; &nbsp; // if our accumulator is not empty, acquire its last element considering it the previous item.&nbsp; &nbsp; if (res[res.length - 1]) previous = res[res.length - 1];&nbsp; &nbsp; else previous = arr[i], item = arr[i+1], i++; // if it doesn't, consider the current item the previous one, and the current item the next one, so increase the index by one to properly skip the next item.&nbsp; &nbsp; // Acquire both datetimes.&nbsp; &nbsp; let [previousDate, nextDate] = [new Date(previous.endTime), new Date(item.endTime)];&nbsp; &nbsp; // if the previous item's date is before the next one, both items should be kept.&nbsp; &nbsp; if (previousDate < nextDate) {&nbsp; &nbsp; &nbsp; res.push(item); // <-- this will become the next "previous".&nbsp; &nbsp; }&nbsp; &nbsp; else res.push(previous); // <-- Otherwise, only the greatest date (which is the previous one) should be kept.&nbsp; }&nbsp; // finally, return the accumulator.&nbsp; return res;}const res = fixChronologicalItems(input);console.log(res);

慕工程0101907

James Coyle 的回答比我的要流畅得多,但这是我对事情的看法。在我的解决方案中,我检查下一个值是否小于当前值,如果是,则使用delete从数组中删除它。如果我们得到数组中的最后一个值,那么我们就不再需要检查下一项,因此我们不进入 if 语句并中断循环。var dataset = [{&nbsp; &nbsp; title: 'Title 1',&nbsp; &nbsp; startTime: '2019-09-26T06:00:00+0100',&nbsp; &nbsp; endTime: '2019-09-26T08:30:00+0100'&nbsp; },&nbsp; {&nbsp; &nbsp; title: 'Title 2',&nbsp; &nbsp; startTime: '2019-09-26T08:00:00+0100',&nbsp; &nbsp; endTime: '2019-09-26T08:15:00+0100'&nbsp; },&nbsp; {&nbsp; &nbsp; title: 'Title 3',&nbsp; &nbsp; startTime: '2019-09-26T08:30:00+0100',&nbsp; &nbsp; endTime: '2019-09-26T09:25:00+0100'&nbsp; },&nbsp; {&nbsp; &nbsp; title: 'Title 4',&nbsp; &nbsp; startTime: '2019-09-26T09:25:00+0100',&nbsp; &nbsp; endTime: '2019-09-26T10:25:00+0100'&nbsp; },&nbsp; {&nbsp; &nbsp; title: 'Title 5',&nbsp; &nbsp; startTime: '2019-09-26T10:25:00+0100',&nbsp; &nbsp; endTime: '2019-09-26T11:00:00+0100'&nbsp; }]var lengthOfArray = dataset.length;for (i = 0; i < dataset.length; i++) {&nbsp; if (lengthOfArray !== i + 1) {&nbsp; &nbsp; var dt = new Date(dataset[i].endTime),&nbsp; &nbsp; dt2 = new Date(dataset[i + 1].endTime);&nbsp; &nbsp; if (dt2 < dt) delete dataset[i + 1].endTime;&nbsp; }&nbsp; else {&nbsp; &nbsp; break;&nbsp; }}console.log(dataset);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript