向循环添加功能

时间:2019-05-05 09:04:28

标签: windows sockets

我需要在一个大型json嵌套集合中搜索,该集合具有递归的唯一ID。该集合包含键值或包含键的嵌套数组。键可以在对象中的任何位置。键可以是数字或字符串。

请注意:如果键值不在数组中,则它们是唯一的。如果它们在数组中,则键将对数组中的每个项目重复。例如,

"WebData": {
      WA1: 3, //not in array so unique
      WA3: 2, so unique
      WA3: "NEO",
      WebGroup : [
    { Web1: 1, //duplicate Web1
              Web2: 2
            },
            { Web1: 2, //duplicate Web2
              Web2: 2
            }]
     }

我想要什么: 例如,我将传递一组具有不同变体的键

  
      
  1. 不在数组中:我将通过键返回其值或总和,例如:
  2.   
function(["WA1",""WA3", "RAE1"],"notsum")

如果我通过(不是总和)

["WA1",""WA3", "RAE1"]

并且该操作不是“求和”,它应该从集合中返回其值的数组

[3,2,1]

如果我通过相同的操作,但操作是求和)

function(["WA1",""WA3", "RAE1"],"sum")

["WA1",""WA3", "RAE1"]

它应该从集合中返回总和

return 6
  
      
  1. 如果在数组中:如果要搜索的值在数组中,则表示它们重复,那么它应该再次返回求和值或它们的各个值。例如
  2.   
["WEB1","Web2"]

。也许可以让我回来,

[7,1]  //Again total of 3+4, 0+1 //see in example

[[3,4],[0,1]]  //Because values are duplicate and in array, just collect them

我需要做一个优雅的方式:

JSON的完整示例:

{
  version: "1.0"
  submission : "editing"
  "WebData": {
          WA1: 3,
          WA3: 2,  
          WA3: "NEO",
          WebGroup : [
        { Web1: 3,
                  Web2: 0
                },
                { Web1: 4,
                  Web2: 1
                }]
  },
  "NonWebData": {
          NWA1: 3,
          NWA2: "INP",
          NWA3: 2,  
  },
  "FormInputs": {
          FM11: 3,
          FM12: 1,
          FM13: 2,

  "RawData" : {
     "RawOverview": {
            "RAE1" : 1,
            "RAE2" : 1,
     },
     "RawGroups":[
                 {
                 "name": "A1",
                 "id":   "1",
                 "data":{
                         "AD1": 'period',
                         "AD2": 2,
                         "AD3": 2,                        
                         "transfers": [
                                       {
                                            "type": "in",
                                            "TT1": 1,
                                            "TT2": 2,
                                       },
                                       {
                                            "type": "out",
                                            "TT1": 1,
                                            "TT2": 2,
                                       }
                ]
                           }
                  },
                 {
                 "name": "A2",
                 "id":   "2",
                 "data":{
                         "AD1": 'period',
                         "AD2": 2,
                         "AD3": 2,                        
                         "transfers": [
                                       {
                                            "type": "in",
                                            "TT1": 1,
                                            "TT2": 2,
                                       },
                                       {
                                            "type": "out",
                                            "TT1": 1,
                                            "TT2": 2,
                                       }
                ]
                           }
                  }
               ]
             },
            "Other":
               { O1: 1,
                 O2: 2,
                 O3: "hello"
               },
            "AddedBy": "name"
            "AddedDate": "11/02/2019"
         }

我无法在此处编写一个函数,可以为我完成此功能,我的代码只是在此数组中搜索,然后遍历查找,这肯定是不正确的方法。

我的代码不太好,并且我在使用某种重复功能。这只是一个片段,可以在一个级别中找到键。我只希望1个或2个函数可以完成所有这些操作

function Search(paramKey, formDataArray) {
    var varParams = [];
    for (var key in formDataArray) {
        if (formDataArray.hasOwnProperty(key)) {
            var val = formDataArray[key];
            for (var ikey in val) {
                if (val.hasOwnProperty(ikey)) {
                    if (ikey == paramKey)
                        varParams.push(val[ikey]);
                }
            }
        }
    }
    return varParams;
}
  
      
  1. 如果在Array中,则是另一个测试用例:仅返回单个值数组,而不添加。 (更新-我是通过编辑下面的代码来实现的)
  2.   
 notsumsingle: function (target, key, value) {
                if (target[key] === undefined) {
                    target[key] = value;
                    return;
                }
                target.push(value);
            },

"groupData": [
            {
                "A1G1": 1,
                "A1G2": 22,
                "AIG3": 4,
                "AIG4": "Rob"
            },
            {
                "A1G1": 1,
                "A1G2": 41,
                "AIG3": 3,
                "AIG4": "John"
            },
            {
                "A1G1": 1,
                "A1G2": 3,
                "AIG3": 1,
                "AIG4": "Andy"
              }
        ],

perform([[“ AIG2”,“” AIG4“],” notsum“)

它回来了

[
    [
        22,
        41,
        3
    ]
],
[
    [
        "",
        "Ron",
        "Andy"
    ]
]

相反,我可以再添加一个类似“ sum”和“ notsum”的变体“ SingleArray”,并将结果作为单个数组获得。

    [
        22,
        41,
        3
    ]

    [
        "",
        "Ron",
        "Andy"
    ]     
  

我问第四点,这个功能是否足够智能,可以自动拾取数组的总和或各个字段的总和。例如,在您的示例中,您使用了“总和”和“总计”来标识它。

console.log(perform(["WA1", "WA3", "RAE1"], "total"));  // 6
console.log(perform(["Web1", "Web2"], "sum"));          // [7, 1]

该函数是否可以使用“ sum”并根据是否找到数组返回单个或数组,如果不返回6,则返回[7,1]

  

5th:如果以这种方式添加json集合,我在代码中发现了一个问题

perform(["RAE1"], "notsum") //[[1,1]]
perform(["RAE1"], "sum")  //2

尽管只定义了一个RAE1,但它返回[1、1]或2,请注意,它不是数组[],因此不应将其编码为[[]]数组,而应将其编码为对象键

 "RawData" : {
 "RawOverview": {
        "RAE1" : 1,
        "RAE2" : 1,
 }

1 个答案:

答案 0 :(得分:0)

为了简化操作,并采用相同的接口获取总和或不总和,而没有任何数组,可以引入另一个操作字符串 with ftplib.FTP('ftp_address', 'user', 'pwd') as ftp, open(file_path, 'rb') as file: ftp.storbinary(f'STOR {file_path.name}', file) ... 以获取所有键的总和。

此方法采用一个对象来获取一个函数,该函数可以将一个值添加到具有相同索引的数组中,或者将该值存储在一个与该函数的给定键数组匹配的指定索引中。

要迭代对象,可以采用键/值对并进行迭代,直到找不到更多对象为止。

结果,您得到一个数组,或所有项目的总和。

顺便说一句,对象的键区分大小写,例如total'WEB1'不匹配。

'Web1'
function perform(keys, operation) {
    function visit(object) {
        Object
            .entries(object)
            .forEach(([k, v]) => {
                if (k in indices) return fn(result, indices[k], v);
                if (v && typeof v === 'object') visit(v);
            });
    }

    var result = [],
        indices = Object.assign({}, ...keys.map((k, i) => ({ [k]: i }))),
        fn = {
            notsum: function (target, key, value) {
                if (target[key] === undefined) {
                    target[key] = value;
                    return;
                }
                if (!Array.isArray(target[key])) {
                    target[key] = [target[key]];
                }
                target[key].push(value);
            },
            sum: function (target, key, value) {
                target[key] = (target[key] || 0) + value;
            }
        }[operation === 'total' ? 'sum' : operation];

    visit(data);
    return operation === 'total'
        ? result.reduce((a, b) => a + b)
        : result;
}

var data = { version: "1.0", submission: "editing", WebData: { WA1: 3, WA3: 2, WAX: "NEO", WebGroup: [{ Web1: 3, Web2: 0 }, { Web1: 4, Web2: 1 }] }, NonWebData: { NWA1: 3, NWA2: "INP", NWA3: 2 }, FormInputs: { FM11: 3, FM12: 1, FM13: 2 }, RawData: { RawOverview: { RAE1: 1, RAE2: 1 }, RawGroups: [{ name: "A1", id: "1", data: { AD1: 'period', AD2: 2, AD3: 2, transfers: [{ type: "in", TT1: 1, TT2: 2 }, { type: "out", TT1: 1, TT2: 2 }] } }, { name: "A2", id: "2", data: { AD1: 'period', AD2: 2, AD3: 2, transfers: [{ type: "in", TT1: 1, TT2: 2 }, { type: "out", TT1: 1, TT2: 2 }] } }] }, Other: { O1: 1, O2: 2, O3: "hello" }, AddedBy: "name", AddedDate: "11/02/2019" };

console.log(perform(["WA1", "WA3", "RAE1"], "notsum")); // [3, 2, 1]
console.log(perform(["WA1", "WA3", "RAE1"], "total"));  // 6
console.log(perform(["Web1", "Web2"], "sum"));          // [7, 1]
console.log(perform(["Web1", "Web2"], "notsum"));       // [[3, 4], [0, 1]]