Сравнение и удаление значений в массиве JavaScript - PullRequest
2 голосов
/ 26 сентября 2019

У меня есть массив с кучей объектов в нем.Значение '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' меньше, чем его предыдущее, а затем удалить его из массива.Любая помощь будет оценена.Спасибо

Ответы [ 3 ]

1 голос
/ 26 сентября 2019

Вот два метода.Первый возвращает массив, в котором элементы сравниваются только с предыдущим объектом в массиве.Второй сравнивает элемент со всеми объектами перед текущим в массиве.

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)
0 голосов
/ 26 сентября 2019

Если вы не хотите изменять исходный массив, и если вы хотите удалить «самое низкое» значение, вы можете сделать один цикл for, который будет:

  • Отслеживать предыдущийзначение.
  • Сравните предыдущее значение с текущим.
  • Отфильтруйте значение в соответствии с вашими потребностями.

Комментарии к коду приведены ниже, это решениеподразумевает зацикливание исходного массива только один раз, используя один цикл for-of.

const input = [
  { 
    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' 
  }
];

function fixChronologicalItems(arr) {
  // Keep track of the previous item.
  let res = [], previous;
  // Iterate all the items of the array.
  for (let i = 0; i < arr.length; i++) {
    // assume the current item is the looped one.
    let item = arr[i];
    // if our accumulator is not empty, acquire its last element considering it the previous item.
    if (res[res.length - 1]) previous = res[res.length - 1];
    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.
    // Acquire both datetimes.
    let [previousDate, nextDate] = [new Date(previous.endTime), new Date(item.endTime)];
    // if the previous item's date is before the next one, both items should be kept.
    if (previousDate < nextDate) {
      res.push(item); // <-- this will become the next "previous".
    }
    else res.push(previous); // <-- Otherwise, only the greatest date (which is the previous one) should be kept.
  }
  // finally, return the accumulator.
  return res;
}
const res = fixChronologicalItems(input);
console.log(res);
0 голосов
/ 26 сентября 2019

Ответ Джеймса Койла гораздо более плавный, чем мой, но вот мой взгляд на вещи.

В моем решении я проверяю, является ли следующее значение меньше текущего значения, если так, то удалите егоиз массива, используя delete .

Если мы доберемся до последнего значения в массиве, нам больше не нужно проверять следующий элемент, поэтому мы не вводим оператор ifи разорвать петлю.

var dataset = [{
    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'
  }
]

var lengthOfArray = dataset.length;
for (i = 0; i < dataset.length; i++) {
  if (lengthOfArray !== i + 1) {
    var dt = new Date(dataset[i].endTime),
    dt2 = new Date(dataset[i + 1].endTime);
    if (dt2 < dt) delete dataset[i + 1].endTime;
  }
  else {
    break;
  }
}
console.log(dataset);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...