如何正确格式化此对象以使其内部没有重复数据?

问题描述

我有一个 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"}
    ]
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...