通过数组迭代设置对象键值对

时间:2018-06-27 15:50:38

标签: javascript arrays object for-loop iteration

我正在尝试使用for循环创建以下数组。但是,我的结果是一个长度为24的数组,内部的所有对象都变成{ key: '23', text: '12:30', value: '12:30' },而不是一个一个地迭代。谁能向我解释为什么每次迭代都会覆盖前一个迭代?

const timeOptions = [
  { key: '0', text: '1:00', value: '1:00' },
  { key: '1', text: '1:30', value: '1:30' },
  { key: '2', text: '2:00', value: '2:00' },
  { key: '3', text: '2:30', value: '2:30' },
  { key: '4', text: '3:00', value: '3:00' },
  { key: '5', text: '3:30', value: '3:30' },
  { key: '6', text: '4:00', value: '4:00' },
  { key: '7', text: '4:30', value: '4:30' },
  { key: '8', text: '5:00', value: '5:00' },
  { key: '9', text: '5:30', value: '5:30' },
  { key: '10', text: '6:00', value: '6:00' },
  { key: '11', text: '6:30', value: '6:30' },
  { key: '12', text: '7:00', value: '7:00' },
  { key: '13', text: '7:30', value: '7:30' },
  { key: '14', text: '8:00', value: '8:00' },
  { key: '15', text: '8:30', value: '8:30' },
  { key: '16', text: '9:00', value: '9:00' },
  { key: '17', text: '9:30', value: '9:30' },
  { key: '18', text: '10:00', value: '10:00' },
  { key: '19', text: '10:30', value: '10:30' },
  { key: '20', text: '11:00', value: '11:00' },
  { key: '21', text: '11:30', value: '11:30' },
  { key: '22', text: '12:00', value: '12:00' },
  { key: '23', text: '12:30', value: '12:30' },
];

这是我写的功能:

var array = Array(24).fill({});
array[0] = { key: '0', text: '1:00', value: '1:00' };

function transform(arr) {
  for (var i = 0; i < arr.length; i++) {
    arr[i].key = i.toString();
    if (i % 2 === 0 && i !== 0) {
      arr[i].text = Number(arr[i - 2].text.split(':')[0]) + 1 + ':00';
      arr[i].value = arr[i].text;
    } else if (i % 2 !== 0) {
      arr[i].text = arr[i - 1].text.split(':')[0] + ':30';
      arr[i].value = arr[i].text;
    }
  }
  return arr;
}

transform(array);

2 个答案:

答案 0 :(得分:7)

您的问题出在第一行:

var array = Array(24).fill({});

基本上,您是说用一堆相同的空对象创建一个数组。因此,当您更改一个时,它将更改所有其他。 您可以想到这一点,因为数组中的每个索引都指向存储该空对象{}的相同内存位置。

这是因为javascript中的数组被认为是可变

对此的快速解决方案是使用for循环手动填充数组。看一下一个工作示例的代码片段:

var array = [];
for(var i = 0; i < 24; i++) {
  array.push({});
}
array[0] = { key: '0', text: '1:00', value: '1:00' };

function transform(arr) {
  for (var i = 0; i < arr.length; i++) {
    arr[i].key = i.toString();
    if (i % 2 === 0 && i !== 0) {
      arr[i].text = Number(arr[i - 2].text.split(':')[0]) + 1 + ':00';
      arr[i].value = arr[i].text;
    } else if (i % 2 !== 0) {
      arr[i].text = arr[i - 1].text.split(':')[0] + ':30';
      arr[i].value = arr[i].text;
    }
  }
  return arr;
}

console.log(transform(array));

答案 1 :(得分:1)

您不需要其他的for循环即可填充数组。相反,只需添加arr [i] = {};在每次迭代的开始:

var array = Array(24);
array[0] = { key: '0', text: '1:00', value: '1:00' };

function transform(arr) {
  for (var i = 0; i < arr.length; i++) {
    **arr[i] = {};**
    arr[i].key = i.toString();
    if (i % 2 === 0 && i !== 0) {
      arr[i].text = Number(arr[i - 2].text.split(':')[0]) + 1 + ':00';
      arr[i].value = arr[i].text;
    } else if (i % 2 !== 0) {
      arr[i].text = arr[i - 1].text.split(':')[0] + ':30';
      arr[i].value = arr[i].text;
    }
  }
  return arr;
}