使用以下 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"}
]
解释:
结果根据产生唯一条目组合的 2 个属性“key_a”和“key_b”合并。 “alt”前缀被添加到其他属性。
编辑:上例中的分组键(key_b、key_a)根据对 api 的请求动态变化,因此另一个 API 响应可能有另一个分组涉及键,例如 key_c,因此该函数应该足够通用以接受分组键作为数组。
编辑 2 为了清楚起见,val_a 和 val_b 只是特定响应的示例。在另一个响应中,可能存在 val_c 或可能缺少 val_a。
我正在考虑接受原始 JSON 和按键分组数组的函数 像这样:
function transformResults(results,groupings){
//...
}
用法:
transformResults(originalJSON,["key_a","key_b"]);
感谢任何帮助:)
最佳答案
您可以为同一组使用哈希表。
这个提议改变了原始对象。
function transformResults(object, keys) {
var getValues = function (o) { return function (k) { return o[k]; }; },
hash = Object.create(null),
result = object.default.map(function (o) {
var key = keys.map(getValues(o)).join('|');
return hash[key] = o;
});
object.alt.forEach(function (o) {
var key = keys.map(getValues(o)).join('|');
if (!hash[key]) {
result.push(hash[key] = {});
keys.forEach(function (k) {
hash[key][k] = o[k];
});
}
Object.keys(o).forEach(function (k) {
if (keys.indexOf(k) === -1) {
return;
}
hash[key]['alt_' + k] = o[k];
});
});
return result;
}
var object = { 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" }, { val_a: 9, val_b: 10, key_a: "C", key_b: "X" }] };
console.log(transformResults(object, ["key_a", "key_b"]));
.as-console-wrapper { max-height: 100% !important; top: 0; }
关于javascript - 根据分组属性加入 2 个对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47267152/