#2 @
pianjiao 有点儿复杂,不过还是写出来了。
var getAttr = function (obj, paths) {
let value = obj;
for (let i = 0; i < paths.length; i++) {
value = value[paths[i]];
}
return value;
};
var rebuild = function (dict, paths) {
// key: email, qq
const pairs = Object.keys(dict).map((key) => {
const obj = getAttr(dict[key], paths);
return [key, obj];
});
console.log("----", pairs);
return pairs.reduce((merged, prev) => {
// prev: ['email', {'rule', 'isShow', extends}]
// merged: ['rule', {'email', 'qq'}]
console.log("--- prev", prev);
Object.entries(prev[1]).forEach(([k, v]) => {
merged[k] = merged[k] || {};
merged[k][prev[0]] = v;
});
return merged;
}, {});
};
// TESTING:
getAttr(list, ["email", "a", "big", "isShow"]); // true
rebuild(list, ["a", "big"]);
// {
// rule: {
// email: ["abig"],
// qq: ["abigqq"],
// },
// isShow: {
// email: true,
// qq: true,
// },
// extends: {
// email: [],
// qq: [],
// },
//