我正在尝试编写一个函数,它接受一个数组数组,并返回一个对象,其中数组中的每对元素作为键值对。我搜索了堆栈溢出并提出了以下代码。但是,我下面的代码仅返回第一个数组 { make: 'Ford' }。我的代码不返回其余的数组。关于为什么我的函数不返回数组数组的其余部分有什么建议吗?
var array = [
['make', 'Ford'],
['model', 'Mustang'],
['year', 1964]
];
function fromListToObject() {
for (var i = 0; i < array.length - 1; ++i) {
var object = {};
//creates an object as a variable
var newArray = array[i];
//creates a variable for the array within the array
object[i] = newArray[1];
//sets the object of the element to position 1 of the array within the array
object[newArray[0]] = object[i];
//sets the key of the element to position 0 of the array within the array
delete object[i];
// removes the previous key of 0
return object;
}
}
console.log(fromListToObject(array));
最佳答案
您的代码有几个问题。
目标对象在每次迭代中都会重置为
{}
。因此,您应该将var object = {}
移出循环。您从循环内部返回,循环立即结束:这应该发生在循环之后。
您迭代的次数太少了。删除
- 1
:for (var i = 0; i < array.length; ++i) {
有一个对数字属性的赋值,您在两行后将其删除:这是一个成本高昂的操作,您应该避免。只需在一次操作中完成分配:
object[newArray[0]] = newArray[1];
这里是所有更正的内容:
var array = [['make', 'Ford'], ['model', 'Mustang'], ['year', 1964]];
function fromListToObject() {
var object = {}; // out of the loop
for (var i = 0; i < array.length; ++i) { // iterate to last
var newArray = array[i];
object[newArray[0]] = newArray[1];
}
return object; // out of the loop
}
var obj = fromListToObject(array);
console.log(obj);
ES6 版本
如果您可以使用 ES6 语法,请考虑以下解决方案:
function fromListToObject(array) {
return Object.assign(...array.map( ([key,val]) => ({[key]: val}),{}));
}
const array = [['make', 'Ford'], ['model', 'Mustang'], ['year', 1964]];
const obj = fromListToObject(array);
console.log(obj);
使用 map
您可能还对 ES6 Map
感兴趣对象,其工作方式与对象类似,可以通过最简单的方式从数组构造:
const mp = new Map(array);
然后您可以按如下方式访问键值:
mp.get('make') === 'Ford';
并迭代:
mp.forEach( function (val, key) {
console.log(key, val);
});
关于javascript - 将数组转换为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42967914/