如何在JavaScript中将多维数组填充到多维对象?
How to populate A multi-dimensional array to multi-dimension object in JavaScript?
很长一段时间以来,我一直在尝试计算如何将我的二维数组填充到对象中。我尝试使用 _.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 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);
对于转换,每个数组都需要一个双嵌套循环。然后生成密钥并构建对象和内容。
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; }
很长一段时间以来,我一直在尝试计算如何将我的二维数组填充到对象中。我尝试使用 _.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 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);
对于转换,每个数组都需要一个双嵌套循环。然后生成密钥并构建对象和内容。
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; }