#javascript #object
#javascript #объект
Вопрос:
У меня есть следующий объект в 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') amp;amp; 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');
Но это не работает.
Вы знаете почему?
Комментарии:
1. вы сравниваете объект с чем?
2. Использовать
Set
вместо массива. Set API напрямую поддерживает ваш вариант использования. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…3. @Ehsan: код обновлен.
4. Хорошо, что вы делаете в своем коде, это переопределяете значение вашего массива результатом функции filter (поэтому у меня будет подмножество исходных значений), а затем загружаете новые данные… это не то, что вы описали, что хотели.
5. @dwaksman это звучит так, как я бы хотел.
Ответ №1:
Наборы были бы лучшим выбором, но если вам необходимо использовать массивы, вы можете использовать функцию для точного определения индекса объекта, а затем просто использовать этот индекс для обновления или отправки новых данных. Следующая функция взята как есть из репозитория 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') amp;amp; 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
});
}
Ответ №2:
Иметь даты в виде объекта того же типа. Вместо того, чтобы использовать «a => a.date», сделайте обе части аргумента объектами date, а затем используйте функцию valueOf().
var date1 = new Date(a.date);
затем проверьте их как
if (date1.valueOf() => date2.valueOf()) // do something