根据对象数据对对象值数组进行分组

Group array of object values based on object data

本文关键字:对象 数组 数据      更新时间:2023-09-26

下面有一个对象

var obj = [
    { name : ["a", "x", "1"] , d : [1,2,3] },
    { name : ["a", "x", "2"] , d : [1,2,3] },
    { name : ["a", "y", "3"] , d : [1,2,3] },
    { name : ["a", "y", "4"] , d : [1,2,3] },
    { name : ["a", "z", "5"] , d : [1,2,3] },
    { name : ["a", "z", "6"] , d : [1,2,3] },
    { name : ["b", "x", "7"] , d : [1,2,3] },
    { name : ["b", "x", "9"] , d : [1,2,3] }
];

以上name数组长度可以是任意…我需要像

那样对数组进行分组
formatted = {
    a : {
      x : {
         1 : [1,2,3],
         2 : [1,2,3]
      },
      y : {
         3 : [1,2,3],
         4 : [1,2,3]
      },
      z : {
         5 : [1,2,3],
         6 : [1,2,3]
      }
    },
    b : {
      x : {
         7 : [1,2,3],
         8 : [1,2,3]
      }
    }
}

是否有算法可用于此。请帮我实现这个逻辑

试试

var formatted = {}, inner, i, j;
for(i = 0; i < obj.length; i++){
   expand(formatted, obj[i].name, obj[i].d)
}
function expand(obj, array, value){
    var key, temp;
    if(array.length == 1){
        obj[array.shift()] = value;
    } else {
        key = array.shift();
        temp = obj[key] = obj[key] || {};
        expand(temp, array, value)
    }
}

演示:小提琴

这个函数已经解决了我的问题。谢谢Feliz Kling的建议

function setToValue(obj, value, path) {
    var parent = obj;
    for (var i = 0; i < path.length - 1; i += 1) {
        parent[path[i]] = parent[path[i]] || {}
        parent = parent[path[i]];
    }
    parent[path[path.length-1]] = value;
}