javascript - 根据分组属性加入 2 个对象数组

标签 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" : 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/

相关文章:

java - 何时使用 DFS 和 BFS

javascript - Chrome Extension WebSQL - 需要后台和内容页面来访问同一个数据库,但他们不需要

javascript - 按子字符串对表格进行排序

c - 变量与存储在数组中的值的高效匹配

javascript - 使用ajax获取json数组

algorithm - 以编程方式以抽象方式无间隙地排列矩形 UI 对象

c# - 在多个 ListBox 控件之间移动项目

javascript - 如何使用 jquery Ajax 和 json 数据将标签包装在 for 循环内?

ruby-on-rails - Array.count 在本地工作正常但在 heroku 上中断

algorithm - 从每个长度为 k 的子数组中找出最大的