Фильтрация данных массива путем вставки / обновления значений с помощью JS - PullRequest
0 голосов
/ 08 марта 2019

У меня есть следующий объект в JS:

[{date: "2019-03-10", roomid: 48, status: "Open"}, {date: "2019-03-11", roomid: 47, status: "Open"}, {date: "2019-03-20", roomid: 48, status: "Book"}]

Как я могу проверить:

  • , если значения roomid и date уже существуют, обновите status.
  • , если значения roomid и date не существуют, введите новые данные.

-

Что я пробовал:

arr = arr.filter(a => a.date != $(this).data('date') && a.roomid != $(this).data('roomid'));
arr.push({
    date: date,
    roomid : roomid,
    status : updatedStatus
});

Я сравниваю этот объект с кликами по нескольким div:

<div data-action="change_status" data-date="2019-03-02" data-roomid="45" data-status="Close">Change status</div>
<div data-action="change_status" data-date="2019-03-02" data-roomid="46" data-status="Open">Change status</div>
<div data-action="change_status" data-date="2019-03-03" data-roomid="46" data-status="Close">Change status</div>
<div data-action="change_status" data-date="2019-03-03" data-roomid="47" data-status="Open">Change status</div>

var status = $(this).data('status');
var date   = $(this).data('date');
var roomid = $(this).data('roomid');

Но это не работает.

Знаете почему?

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Даты имеют одинаковый тип объекта.Вместо "a => a.date" сделайте обе части аргумента объектами даты, а затем используйте функцию valueOf ().

var date1 = new Date(a.date);

, затем отметьте их как

if (date1.valueOf() => date2.valueOf()) // do something
0 голосов
/ 08 марта 2019

Наборы были бы лучшим выбором, но если вы должны использовать массивы, вы можете использовать функцию, чтобы точно определить индекс объекта, а затем просто использовать этот индекс для обновления или передачи новых данных. Следующая функция взята из репозитория lodash на github здесь: https://github.com/lodash/

function findIndex(array, predicate, fromIndex) {
   var length = array == null ? 0 : array.length;
   if (!length) {
      return -1;
   }
   var index = fromIndex == null ? 0 : toInteger(fromIndex);
   if (index < 0) {
      index = nativeMax(length + index, 0);
   }
   return baseFindIndex(array, getIteratee(predicate, 3), index);
}

Что бы я сделал:

let idx = findIndex( arr, a => {
   return (a.date != $(this).data('date') && a.roomid != $(this).data('roomid'));
})

if (idx != -1) {
   //update
   arr[idx].status = "new status"
}

else {
   //push new
   arr.push({
    date: date,
    roomid : roomid,
    status : updatedStatus
});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...