将数组转换为对象

时间:2017-03-23 05:27:20

标签: javascript arrays

我正在尝试编写一个接收数组数组的函数,并返回一个对象,该对象将数组中的每对元素作为键值对。我搜索了堆栈溢出并提出了以下代码。但是,我的代码只返回第一个数组{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));
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:1)

试试这个

您已在循环中声明obj。 在迭代期间

object = Object {make: "Ford"}, i = 0

第一次迭代后你的功能

console.log(fromListToObject(array));

被调用。 这是因为你在循环中调用了返回,这应该在循环之外完成。 将代码重写为

&#13;
&#13;
var array = [
    ['make', 'Ford'],
    ['model', 'Mustang'],
    ['year', 1964]
  ],
  i, j = array.length,
  object = {}

function fromListToObject() {

  for (i = 0; i < j; i++) {
    var newArray = array[i];
    object[i] = newArray[1];
    object[newArray[0]] = object[i];
    delete object[i];
  }
  return object;
}

console.log(fromListToObject(array));
&#13;
&#13;
&#13;

&#13;
&#13;
var array = [['make', 'Ford'], ['model', 'Mustang'], ['year', 1964]];

var obj = {};
array.forEach(function(data){
    obj[data[0]] = data[1]
});
console.log(obj);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您的代码有几个问题。

  • 在每次迭代中,目标对象重置为{}。因此,您应该将var object = {}移出您的循环。

  • 你从循环内部返回,它立即结束它:在循环后发生。

  • 你迭代一次太少了。删除- 1

     for (var i = 0; i < array.length; ++i) {
    
  • 有一个数字属性的赋值,你稍后删除2行:这是一个代价高昂的操作,你应该避免。只需在一个操作中完成任务:

     object[newArray[0]] = newArray[1];
    

以下是纠正的一切:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

ES6版本

如果您可以使用ES6语法,请考虑以下解决方案:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

使用地图

您可能也对ES6 Map对象感兴趣,该对象与对象的工作方式类似,可以通过最简单的方式从数组构造:

const mp = new Map(array);

然后,您可以按如下方式访问键值:

mp.get('make') === 'Ford';

迭代:

mp.forEach( function (val, key) {
    console.log(key, val);
});

答案 2 :(得分:0)

while:Not Counting!

object = {};
while( array[0] )object[ array[0][0] ] = array[0][1], array.shift();

将导致:

object;
>> Object { make: "Ford", model: "Mustang", year: 1964 }

array;
>> Array [ ]

此操作实际上将调度数组成员以修补对象! 数组内容将物理上错位到新声明的对象。