Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据分组属性连接2个对象数组_Javascript_Arrays_Algorithm_Object_Group By - Fatal编程技术网

Javascript 根据分组属性连接2个对象数组

Javascript 根据分组属性连接2个对象数组,javascript,arrays,algorithm,object,group-by,Javascript,Arrays,Algorithm,Object,Group By,使用以下JSON API响应: { "default" : [ {"val_a" : 5 , "val_b": 10, "key_a":"A", "key_b":"X"}, {"val_a" : 15 , "val_b": 11, "key_a":"A", "key_b":"Y"}, {"val_a" : 6 , "val_b": 12, "key_a":"B", "key_b":"Z"} ], "alt" : [ {"val_a

使用以下JSON API响应:

{
   "default" : [
      {"val_a" : 5 , "val_b": 10, "key_a":"A", "key_b":"X"},
      {"val_a" : 15 , "val_b": 11, "key_a":"A", "key_b":"Y"},
      {"val_a" : 6 , "val_b": 12, "key_a":"B", "key_b":"Z"}
   ],
   "alt" : [
      {"val_a" : 15 , "val_b": 11, "key_a":"A", "key_b":"Y"},
      {"val_a" : 9 , "val_b": 10, "key_a":"A", "key_b":"X"}
   ]
}
我正在尝试编写一个合并函数,该函数将给出以下结果:

[
 {"alt_val_a":9, "alt_val_b":10 ,"val_a" : 5 , "val_b": 10, "key_a":"A", "key_b":"X"},
 {"alt_val_a":15, "alt_val_b":11 ,"val_a" : 15 , "val_b": 11, "key_a":"A", "key_b":"Y"},
 {"val_a" : 6 , "val_b": 12, "key_a":"B", "key_b":"Z"}
]
解释
结果基于两个属性进行合并,“key_a”和“key_b”,这两个属性生成唯一的条目组合。“alt”前缀将添加到其他属性中

编辑:上述示例中的分组键(键b、键a)根据对api的请求而动态变化,因此另一个api响应可能涉及另一个分组键,例如键c,因此该函数应足够通用,以将分组键作为数组接受

编辑2为了清楚起见,val_a和val_b只是一个特定响应的示例。在另一个响应中,val_c可能存在或val_a可能缺失

我正在考虑一个函数,它接受原始JSON和一个GROUPBY键数组 像这样:

用法:

transformResults(originalJSON,["key_a","key_b"]);

非常感谢您的帮助:)

您可以为同一组使用哈希表

这个建议改变了原来的目标

函数转换结果(对象、键){
var getValues=function(o){return function(k){return o[k];};},
hash=Object.create(null),
结果=object.default.map(函数(o){
var key=keys.map(getValues(o)).join(“|”);
返回hash[key]=o;
});
object.alt.forEach(函数(o){
var key=keys.map(getValues(o)).join(“|”);
如果(!哈希[键]){
push(hash[key]={});
键。forEach(函数(k){
散列[key][k]=o[k];
});
}
Object.keys(o).forEach(函数(k){
if(键索引of(k)=-1){
返回;
}
散列[key]['alt_'+k]=o[k];
});
});
返回结果;
}
var对象={{默认值:{默认值:{默认值:{默认值:5,5,5,5,10,10,钥匙a:“a”,钥匙b:“X”},{{5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,10,10,10,10,10,12,8,8,5,5,15,15,15,10,10,11,11,11,钥匙a,钥匙a:“a:“a:“a:“a”a:“a:“a:“a:“a:“a:“a:“a:“a:“a:“a:“a:“a:“a:“a:“a:“a:“a:“a:“a:“a:“a:“a”,“a”,“a”,“a”,a”,a”,a”,a”,a”,a”,a”,a”,钥匙,11,a“a“a,”a,”a,”a,”a”,钥匙,b:“a“b:“a“a,”a”,a”a a:“C”,b键:“X”}]};
log(transformResults(对象,[“key_a”,“key_b”])

.as console wrapper{max height:100%!important;top:0;}
您可以迭代原始结果并基于组键创建新对象,如下所示:

{ AX: 
   { val_a: 5,
     val_b: 10,
     key_a: 'A',
     key_b: 'X',
     alt_val_a: 9,
     alt_val_b: 10 },
  AY: 
   { val_a: 15,
     val_b: 11,
     key_a: 'A',
     key_b: 'Y',
     alt_val_a: 15,
     alt_val_b: 11 },
  BZ: { val_a: 6, val_b: 12, key_a: 'B', key_b: 'Z' } }
然后将键映射到最终数组。
以下是我的通用版本:
函数转换结果(结果、分组){
让reducedResults=Object.keys(results).reduce((modified,originalKey)=>{
//迭代原始结果
结果[originalKey].forEach((行)=>{
//基于分组键值创建动态键
让groupKey=groupings.reduce((resultKey,keyVal)=>{
resultKey=resultKey+行[keyVal];
返回结果键;
}, "");
//迭代每行的值
Object.keys(行).forEach((行键)=>{
//确定是否应将前缀添加到原始行键
让finalKey=(originalKey=='default'| | groupings.indexOf(rowKey)!==-1)?rowKey:originalKey+“|”+rowKey;
//创建一个修改过的对象,其中键是唯一的组值
修改的[groupKey]=修改的[groupKey]| |{};
修改的[groupKey][finalKey]=行[rowKey];
});
});
修改返回值;
}, {});
//映射对象结果并将结果修改为数组
返回Object.keys(reducedResults.map)((gKey)=>{
返回还原结果[gKey];
});
}
让数据={
“默认值”:[
{“val_a”:5,“val_b”:10,“key_a”:“a”,“key_b”:“X”},
{“val_a”:15,“val_b”:11,“key_a”:“a”,“key_b”:“Y”},
{“val_a”:6,“val_b”:12,“key_a”:“b”,“key_b”:“Z”}
],
“alt”:[
{“val_a”:15,“val_b”:11,“key_a”:“a”,“key_b”:“Y”},
{“val_a”:9,“val_b”:10,“key_a”:“a”,“key_b”:“X”}
]
};

日志(转换结果(数据,[“键a”,“键b”))
是否确实要更改同一组中新添加值的属性名称?是的,因为响应的alt部分表示不同的值,所以它们恰好具有save KEYGREST,但是如果alt数组包含默认数组中不存在的唯一组合,则会将其忽略,例如add
{“val\u a”:9,“val_b”:10,“key_a”:“C”,“key_b”:“X”}
对于alt数组,它应该在以下结果中显示为
{“alt_val_a”:9,“alt_val_b”:10,“key_a”:“C”,“key_b”:“X”}
超级,这就是我要找的!
{ AX: 
   { val_a: 5,
     val_b: 10,
     key_a: 'A',
     key_b: 'X',
     alt_val_a: 9,
     alt_val_b: 10 },
  AY: 
   { val_a: 15,
     val_b: 11,
     key_a: 'A',
     key_b: 'Y',
     alt_val_a: 15,
     alt_val_b: 11 },
  BZ: { val_a: 6, val_b: 12, key_a: 'B', key_b: 'Z' } }