将给定结构的二维数组转换为嵌套对象的数组

时间:2019-09-05 13:23:11

标签: javascript arrays nested-object

我有一个排序的二维数组作为输入。我需要以如下所示的相同结构来获取嵌套对象的数组。如何获得预期的输出?

input = [
["1", "2", "3", "4", "5", "6", "7", "8"],
["1", "2", "3", "4", "5", "6", "7", "9"],
["cat", "accessories", "clothes"],
["cat", "food", "dry"],
["cat", "food", "wet"],
["dog", "drinks"],
["dog", "food"]];

这是我尝试过的:

var output = [];    
input.forEach((v, i) => {    
if (i !== 0){
    var temp_obj = {};

    for(let j=0; j<v.length; j++){
        if (input[i-1][j] === v[j]){
            temp_obj[input[i-1][j]] = [];
        }else if (!_.isEmpty(temp_obj) && typeof(input[i-1][j]) !== 'undefined'){
            console.log('this is it ', temp_obj)
        }
    }
    if (!_.isEmpty(temp_obj)){
        output.push(temp_obj);
    }
}
})

console.log(output)    

预期产量

   output = [{
        "1": [{
            "2": [{
                "3": [{
                    "4": [{
                        "5": [{
                            "6": [{
                                "7": [{
                                    "8": []
                                }, {
                                    "9": []
                                }]
                            }]
                        }]
                    }]
                }]
            }]
        }]
    },
    {
        "cat": [{
            "accessories": [{
                "clothes": []
            }]
        }, {
            "food": [{
                "dry": []
            }, {
                "wet": []
            }]
        }]
    },
    {
        "dog": [{
            "food": []
        }, {
            "drinks": []
        }]
    }
]

2 个答案:

答案 0 :(得分:0)

您可以找到每个嵌套级别带有键的所需对象。

var input = [["1", "2", "3", "4", "5", "6", "7", "8"], ["1", "2", "3", "4", "5", "6", "7", "9"], ["cat", "accessories", "clothes"], ["cat", "food", "dry"], ["cat", "food", "wet"], ["dog", "drinks"], ["dog", "food"]],
    result = input.reduce((r, keys) => {
        keys.reduce((a, k) => {
            var temp = a.find(o => k in o);
            if (!temp) a.push(temp = { [k]: [] });
            return temp[k];
        }, r);
        return r;
    }, []);

   console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

减少是你的朋友

input = [
  ["1", "2", "3", "4", "5", "6", "7", "8"],
  ["1", "2", "3", "4", "5", "6", "7", "9"],
  ["cat", "accessories", "clothes"],
  ["cat", "food", "dry"],
  ["cat", "food", "wet"],
  ["dog", "drinks"],
  ["dog", "food"]
];

const structure = input.reduce((obj, arr) => {
  const last = arr.pop()
  const chain = arr.reduce((o, key) => {
    o[key] = o[key] || {}
    return o[key]
  }, obj)
  chain[last] = []
  return obj
}, {})

//console.log(structure)
var finalArray = Object.entries(structure).map(
  ([k,v]) => ({[k]:v})
)
console.log(finalArray)

相关问题