后台返回的一个二维数组,我想转换为多维数组,用 javascript

大神们好,我现在有一个这样的需求,后台返回一个二维的数组,然后我根据参数的不同转化为多维数组;


后台返回的数组:(这个是我手写的假数据)

    var arr = [
        {"id": 64,"relation": -10, "userid": 20, "peiou": 0, "child": [], "peiouArr": []},
        {"id": 1, "relation": 64, "userid": 7, "peiou": 10, "child": [], "peiouArr": []},
        {"id": 10,"relation": -1, "userid": 8, "peiou": 0, "child": [], "peiouArr": []},
        {"id": 16,"relation": 1, "userid": 10, "peiou": 20, "child": [], "peiouArr": []},
        {"id": 88,"relation": 1, "userid": 11, "peiou": 44, "child": [], "peiouArr": []},
        {"id": 4, "relation": -1, "userid": 13, "peiou": 0, "child": [], "peiouArr": []},
        {"id": 55,"relation": 64, "userid": 5, "peiou": -1, "child": [], "peiouArr": []},
        {"id": 15,"relation": 1, "userid": 9, "peiou": 32, "child": [], "peiouArr": []},
        {"id": 32,"relation": -1, "userid": 14, "peiou": 0, "child": [], "peiouArr": []}
    ];

现在要根据这个数组来做一些改变,下面是我希望得到的数据

var arr = {
    {"id": 64,"relation": -10, "userid": 20, "peiou": 0, "child": [
        {"id": 1, "relation": 64, "userid": 7, "peiou": 10, "child": [
            {"id": 16,"relation": 1, "userid": 10, "peiou": 20, "child": [], "peiouArr": []},
            {"id": 88,"relation": 1, "userid": 11, "peiou": 44, "child": [], "peiouArr": []},
            {"id": 15,"relation": 1, "userid": 9, "peiou": 32, "child": [], "peiouArr": [
                {"id": 32,"relation": -1, "userid": 14, "peiou": 0, "child": [], "peiouArr": []}
            ]}
        ], "peiouArr": [
            {"id": 10,"relation": -1, "userid": 8, "peiou": 0, "child": [], "peiouArr": []}
        ]},
        {"id": 55,"relation": 64, "userid": 5, "peiou": -1, "child": [], "peiouArr": []}
    ], "peiouArr": [{}]}
};

说明一下逻辑:

  • 根据数组第一个值中 'id' 来查找剩下的数组中是否有 'id' == 'relation' ,如果有,就要把当前检查的这个放在与它相等的值的 ['child'] 属性中;

表达能力不好,我还是举例说明把。
当到这个数据后,获取第一个的 ['id'] 值 arr0,也就是64,然后再循环整个数组,看看有没有哪个的 ['relation'] 属性值与当前的 ['id'] 值相等,现在找到了 第二个和第七个是满足条件的,此时,就把第二个和第七个放到第一个数组的 ['child'] 属性中,然后,再查找数组中第一个的 ['peiou'] 值,如果 ['peiou'] 不是0,那就看看有没有哪个属性的 ['id'] 属性值与当前的 ['peiou'] 相等, 如果有,就放到 ['peiouArr'] 中。

嗯,就是这样,求大神给个解决办法!
我现在是这样写的:

function arrCombination(arr) {
    for (var i = 0; i < arr.length; i++)
        for (var j = 0; j < arr.length; j++) {
            if (arr[i]["id"] === arr[j]["relation"])
                arr[i]["child"].push(arr[j]);
            if (arr[i]["peiou"] !== 0 && arr[i]["peiou"] === arr[j]["id"])
                arr[i]["peiouArr"].push(arr[j]);
        }
    return arr[0];
}

但老是有问题,有别的解决办法吗?

阅读 3.2k
2 个回答

供参考

var map = arr.reduce((map, el) => map.set(el.id, el), new Map())
var newArr
arr.forEach(el => {
  let {relation, peiou, peiouArr} = el
  if (map.has(peiou)) { peiouArr.push(map.get(peiou)) }
  if (relation === -10) { newArr = el }
  else if (map.has(relation)) { map.get(relation).child.push(el) }
})
console.log(newArr)
var arr = [
    {"id": 64,"relation": -10, "userid": 20, "peiou": 0, "child": [], "peiouArr": []},
    {"id": 1, "relation": 64, "userid": 7, "peiou": 10, "child": [], "peiouArr": []},
    {"id": 10,"relation": -1, "userid": 8, "peiou": 0, "child": [], "peiouArr": []},
    {"id": 16,"relation": 1, "userid": 10, "peiou": 20, "child": [], "peiouArr": []},
    {"id": 88,"relation": 1, "userid": 11, "peiou": 44, "child": [], "peiouArr": []},
    {"id": 4, "relation": -1, "userid": 13, "peiou": 0, "child": [], "peiouArr": []},
    {"id": 55,"relation": 64, "userid": 5, "peiou": -1, "child": [], "peiouArr": []},
    {"id": 15,"relation": 1, "userid": 9, "peiou": 32, "child": [], "peiouArr": []},
    {"id": 32,"relation": -1, "userid": 14, "peiou": 0, "child": [], "peiouArr": []}
];
function makeObj(arr){
    var obj = {};
    for(var i=0;i<arr.length;i++){
        obj[arr[i].id] = arr[i];
    }
    return obj;
}

var pool = makeObj(arr);

function makeResult(arr){
    for(var i=1;i<arr.length;i++){
        var obj = pool[arr[i].relation];
        if(obj){
            obj.child.push(arr[i]);
        }
        if(arr[i].peiou !== 0){
            obj = pool[arr[i].peiou];
            if(obj){
                arr[i].peiouArr.push(obj);
            }
        }
    }
    return arr[0];
}

var result = makeResult(arr);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题