我在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');
但这不起作用。
你知道为什么吗?
答案 0 :(得分:0)
设置是一个更好的选择,但是如果必须使用数组,则可以使用函数来精确定位对象的索引,然后仅使用该索引来更新或推送新数据。 以下功能是从github上lodash仓库中获取的: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
});
}
答案 1 :(得分:0)
将日期设置为相同的对象类型。而不是使用“ a => a.date”将参数的两个部分都用作日期对象,然后使用valueOf()函数。
var date1 = new Date(a.date);
然后将其作为
if (date1.valueOf() => date2.valueOf()) // do something