将多维数组转换为对象

时间:2016-07-25 12:08:03

标签: javascript arrays json object multidimensional-array

我有一个最多[32] [32]个条目的二维数组。 而且我想将其转换为类似的东西:

[
    null, 
    null, 
    null, 
    null, 
    null, 
    null, 
    [null, null, null, null, null, null, null, null, null, null, "player1"],
    [null, null, null, null, null, "player2"]
]

{
  "6": {"10":"player1"},
  "7": {"5":"player2"}
}

所以这将是我的阵列:

var gameField = [];
gameField[6] = [];
gameField[6][10] = "player1";
gameField[7] = [];
gameField[7][5] = "player2";

现在我尝试使用它:

var obj = {}
obj = Object.assign({},gameField);
console.log(JSON.stringify(obj));

但它只适用于外部数组,内部数组不受影响:

{
    "6": [null, null, null, null, null, null, null, null, null, null, "player1"],
    "7": [null, null, null, null, null, "player2"]
}

正确做到这一点的最短途径是什么?

3 个答案:

答案 0 :(得分:4)

您可以迭代数组中的项目,然后递归,如果找到的项目本身就是一个数组(使用Array.isArray检查)

function populateFromArray(array) {
  var output = {};
  array.forEach(function(item, index) {
    if (!item) return;
    if (Array.isArray(item)) {
      output[index] = populateFromArray(item);
    } else {
      output[index] = item;
    }
  });
  return output;
}

console.log(populateFromArray(input));

这导致:

[object Object] {
  6: [object Object] {
    10: "player1"
  },
  7: [object Object] {
    5: "player2"
  }
}

查看working jsBin

注意:您当然可以用更少的代码执行此操作,但代码越少越好!

答案 1 :(得分:3)

Array.prototype.reduce()似乎是理想的。你可以这样做;

var dataArr = [null,null,null,null,null,null,[null,null,null,null,null,null,null,null,null,null,"Player1"],[null,null,null,null,null,"player2"]],
    dataObj = dataArr.reduce((p,c,i) => (Array.isArray(c) && (p[i] = {[c.length-1]:c[c.length-1]}),p),{});
console.log(dataObj);

答案 2 :(得分:1)

您可以使用此递归函数,使用ES6代码:

var data = [null,null,null,null,null,null,[null,null,null,null,null,null,null,null,null,null,"player1"],[null,null,null,null,null,"player2"]];

function convert(data) {
    return Array.isArray(data)
        ? data.reduce( (obj, el, i) => (el && (obj[i] = convert(el)), obj), {} )
        : data;
}

var obj = convert(data);

console.log(obj);

当您的输入数组嵌套深度超过2级时,这也适用。它不要求非null元素位于其(子)数组的末尾,也不要求每个(子)数组只有一个非null元素。