我一直试图将我的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()
。
答案 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; }