我需要在一个大型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
}]
}
我想要什么: 例如,我将传递一组具有不同变体的键
- 不在数组中:我将通过键返回其值或总和,例如:
function(["WA1",""WA3", "RAE1"],"notsum")
如果我通过(不是总和)
["WA1",""WA3", "RAE1"]
并且该操作不是“求和”,它应该从集合中返回其值的数组
[3,2,1]
如果我通过相同的操作,但操作是求和)
function(["WA1",""WA3", "RAE1"],"sum")
["WA1",""WA3", "RAE1"]
它应该从集合中返回总和
return 6
- 如果在数组中:如果要搜索的值在数组中,则表示它们重复,那么它应该再次返回求和值或它们的各个值。例如
["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;
}
- 如果在Array中,则是另一个测试用例:仅返回单个值数组,而不添加。 (更新-我是通过编辑下面的代码来实现的)
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,
}
答案 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]]