如何解决如何正确格式化此对象以使其内部没有重复数据?
我有一个 HTML 表单,用户可以在其中向表单添加时间数据(开始和结束),并且可以选择多天来保存它。 (这是针对每天打开的循环泵每天的关闭时间)。
The form looks like this from the user point of view
我是这样处理表单的:
function saveCircularPumpTimes(){
$("#circularTableForm").on("submit",function(e){
e.preventDefault();
var inputs = $("#circularTableForm").serializeArray();
console.log(inputs);
/*
var newCircularObj = {
"mon":[
{ start:"",end:"" },{ start:"",end:"" }
],"tue":[
{ start:"",};
*/
var days = $("#circularPumpDays").val();
var datas = [];
for(var i = 0; i < inputs.length; i++){
// get all the time data to an array for easier processing later.
if( inputs[i].name.includes("circularPumpOnTimeStart") ){
datas.push( { start:"",end:"" } );
datas[datas.length-1].start = inputs[i].value;
}else if( inputs[i].name.includes("circularPumpOnTimeEnd") ){
datas[datas.length-1].end = inputs[i].value;
}
}
console.log("Days: ",days);
console.log("Datas: ",datas);
});
}
days 数组如下所示:
["mon","tue","wed"]
数据如下所示:
[
{start: "15:36",end: "16:36"},{start: "15:36",end: "15:36"},end: "15:37"},end: "15:37"}
]
当用户选择多天时,我会这样做:
for(var i = 0; i < days.length; i++){
if(Object.prototype.hasOwnProperty.call(newCircularObj,days[i])) {
// User already have saved data for this day
if( prompt("This day already exist with data inside it. Would you like to overwrite?") ){
newCircularObj[days[i]] = [];
for(var k = 0; k < datas.length; k++){
newCircularObj[days[i]].push( datas[i] );
}
}
}else{
// We don't have saved data for this day,create new
newCircularObj = new Object(days[i]);
for(var k = 0; k < datas.length; k++){ // yeah this loop is duplicate. :( i will put it into a function
newCircularObj[days[i]].push( datas[i] );
}
}
}
这种方法的问题是数据将在对象内多次存在,我必须将其保存到 MCU 中,因此空间非常重要。 例如,如果用户每次都选择所有 7 天相同的时间,则数据将在对象内包含 7 次。
在 MCU 方面,我将 ArduinoJSON 库与 ESP32 一起使用,我会像这样处理它(因为您可以看到整个字符串化的 json 对象一直在 ram 内,所以我真的需要空间):
static const inline void processData(String DATA){ // in every single minute we have to do this and search for the start time.
boolean found = false;
SpiRamJsonDocument doc(15000);
DeserializationError error = deserializeJson(doc,DATA); // we get the data as a JSON string.
if (error) {
String Error = "JSON Error Pump ~ ";
Error += String(error.c_str());
errorLog(Error);
Send_Async("No Memory for circular Pump DATA",";RoomHeating");
}else {
JsonObject documentRoot = doc.as<JsonObject>();
for (JsonPair timeData : documentRoot) {
if(Time.Get_Day() == timeData.key().c_str()){ // Time.Get_Day() is equalent with the current day String like "mon" or "tue"
// if the day is okay we have to search for the times
JsonArray Day = doc[Time.Get_Day()];
for(int i = 0; i < Day.size(); i++){
if(Time_Has_Reached(Day[i]["start"],Day[i]["end"])){ // function for check if the start time has passed but the end is not
// if in between
found = true;
break;
}
}
if(found){break;}
}
}
}
if(found){
// Turn on the pump
}else{
// Turn off the pump
}
}
所以问题是,如果时间数据已经保存到一天,我该如何安排对象以便时间数据只存在一次以提高效率。
编辑: 来自最终对象的示例:
var newCircularObj = {
"mon":[
{ start:"14:10",end:"15:10" },{ start:"14:10",],"tue":[
{ start:"14:10","wed":[
{ start:"14:10","thu":[
{ start:"14:10","sat":[
{ start:"14:10",};
解决方法
好的,这个程序会从 newCircularObj
中删除重复项:
我已经采取了你的样本并修改了 newCircularObj
的一些值:
$(function() {
function removeDup(ar) {
return ar.reduce(function(item,e1) {
var matches = item.filter(function(e2) {
return e1.start == e2.start && e1.end == e2.end
});
if (matches.length == 0) {
item.push(e1);
}
return item;
},[]);
}
var result = {datas:{} };
Object.keys(newCircularObj).forEach(function(it,i) {
result.datas[it] = removeDup(newCircularObj[it]);
});
console.log(result);
});
var newCircularObj = {
"mon":[
{ start:"14:10",end:"15:10" },{ start:"14:11",{ start:"14:10",end:"15:11" },],"tue":[
{ start:"14:10","wed":[
{ start:"14:10","thu":[
{ start:"14:10","sat":[
{ start:"14:10",};
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
结果
{
datas: {
mon: [
{ end: "15:10",start: "14:10"},{ end: "15:10",start: "14:11"},{ end: "15:11",start: "14:10"}
],sat: [
{ end: "15:10",thu: [
{ end: "15:10",tue: [
{ end: "15:10",start: "14:11"}
],wed: [
{ end: "15:10",start: "14:10"}
]
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。