如何在JavaScript中将多维数组填充到多维对象?

时间:2017-10-24 07:17:23

标签: javascript arrays object underscore.js

我一直试图将我的2D数组填充到对象上一段时间。我尝试使用_.map(),但它没有给我我期待的结果。

我有一个存储的数组:

// My array
var myArray = [ [foo, bar, fiz], [faz, far, fee] ];

// My object
var myObject = {
    key1: {
        val1: 1,
        val2: 2,
        val3: 3
    },
    key2: {
        val1: 1,
        val2: 2,
        val3: 3
    }
}

我想要达到的结果是:

var myObject = {
    key1: {
        val1: foo,
        val2: bar,
        val3: fiz
    },
    key2: {
        val1: faz,
        val2: far,
        val3: fee
    }
}

这是我到目前为止所得到的:

_.map(myObj, x => {
    for (var i = 0; myArray.length; i++) {
        x.val1 = myArray[i][0];
        x.val2 = myArray[i][1];
        x.val3 = myArray[i][2];
    }
}

我遇到_.map()的问题我希望它只迭代一次。由于数组和对象的长度相同,我认为有必要迭代两次。不幸的是,我的数组没有可以用来区分的键,否则我会使用Object.assign()

2 个答案:

答案 0 :(得分:3)

由于丢弃了对象的原始值,并且可以轻松地再现对象的键,因此可以使用2 Array#reduce方法从数组构建对象:



var myArray = [ ['foo', 'bar', 'fiz'], ['faz', 'far', 'fee'] ];

var myObject = myArray.reduce(function(obj, arr, i) {
  obj['key' + (i + 1)] = arr.reduce(function(o, item, j) {
    o['val' + (j + 1)] = item;
    return o;
  }, {});
  
  return obj;
}, {});

console.log(myObject);




答案 1 :(得分:0)

对于转换,每个数组都需要一个双嵌套循环。然后生成密钥并构建对象和内容。

var array = [['foo', 'bar', 'fiz'], ['faz', 'far', 'fee']],
    object = {};
    
array.forEach(function (a, i) {
    var key = 'key' + (1 + i);
    object[key] = object[key] || {};
    a.forEach(function (b, j) {
        object[key]['val' + (1 + j)] = b;
    })
});

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

对于变量键,您可以将一些数组与键一起使用,并将其用于外部和内部级别。

var array = [['foo', 'bar', 'fiz'], ['faz', 'far', 'fee']],
    topKeys = ['key1', 'key2'],
    subKeys = ['val1', 'val2', 'val3'],
    object = {};
    
array.forEach(function (a, i) {
    object[topKeys[i]] = object[topKeys[i]] || {};
    a.forEach(function (b, j) {
        object[topKeys[i]][subKeys[j]] = b;
    })
});

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