我正在尝试使用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);
答案 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;
}