我有一个包含ID和名称的数组对象
const stages = [{
id: 1,
name: ''
}, {
id: 2,
name: ''
}, {
id: 3,
name: ''
}, {
id: 4,
name: ''
}, {
id: 5,
name: ''
}, {
id: 6,
name: ''
}, {
id: 7,
name: ''
}, {
id: 8,
name: ''
}];
另外,我有一个包含数字的数组。
const indexPositions = [0, 1, 2, 2, 2, 3, 2, 0];
我想创建一个包含数组的第三个数组。 distances
中的每个数字代表数组中当前数组的索引。
如果当前数组尚不存在,我想先创建它。显然,我必须创建新的数组,直到到达该索引位置。
示例: 我的数组在开始时是空的。第一个索引位置是0,所以我必须为此创建一个新数组。下一个索引位置是3,所以我必须创建更多数组,直到有4个数组。
我要做的就是将载物台推到正确的水平索引位置。该示例的结果将是
const levels = [
[stage1, stage8],
[stage2],
[stage3, stage4, stage5, stage7],
[stage6]
];
当前我的代码看起来是这样
$(document).ready(() => {
const levels = []; // the array containing the arrays
stages.forEach((stage, stageIndex) => {
const indexPosition = indexPositions[stageIndex];
const positionDifference = indexPosition - levels.length;
if (positionDifference > 0) {
for (let i = 0; i < positionDifference; i++) { // fill up with empty arrays
levels.push([]);
}
}
levels[indexPosition].push(stage);
});
});
我收到此错误Uncaught TypeError: Cannot read property 'push' of undefined
,这是因为indexPosition超出范围。如果positionDifference
为0,则不会创建任何数组,但开始时该数组为空。
我尝试将levels.length
设置为-1(如果它为0),但是如果差为1,我仍然会收到错误消息,我在位置0创建了一个数组,并想访问位置1。
如果空数组不存在,如何创建?
答案 0 :(得分:1)
虽然我不完全了解您要做什么,但是检查数组元素的存在很简单,一种实现方法是将其强制为布尔值:
const thing=[];
function addElem(where,what){
if(!thing[where]) // <- here
thing[where]=[];
thing[where].push(what);
}
addElem(2,1);
addElem(2,2);
addElem(2,3);
addElem(5,1);
console.log(thing);
(索引故意是不连续的,因为这无关紧要:JavaScript数组稀疏)
答案 1 :(得分:1)
您可以使用单个循环并为索引添加数组(如果不存在)。然后推送所需的值。
var stages = [{ id: 1, name: '' }, { id: 2, name: '' }, { id: 3, name: '' }, { id: 4, name: '' }, { id: 5, name: '' }, { id: 6, name: '' }, { id: 7, name: '' }, { id: 8, name: '' }],
indexPositions = [0, 1, 2, 2, 2, 3, 2, 0],
result = stages.reduce((r, o, i) => {
var index = indexPositions[i];
r[index] = r[index] || []; // take default value for falsy value
r[index].push('stage' + o.id); // instead of string take object
return r;
}, []);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:1)
您实际上非常亲密!您的代码中有一个很小的问题。
$(document).ready(() => {
const levels = []; // the array containing the arrays
stages.forEach((stage, stageIndex) => {
const indexPosition = indexPositions[stageIndex];
const positionDifference = indexPosition - levels.length + 1; //YOU DID NOT ADD 1 HERE
if (positionDifference > 0) {
for (let i = 0; i < positionDifference; i++) { // fill up with empty arrays
levels.push([]);
}
}
levels[indexPosition].push(stage);
});
});
在计算positionDifference时,当indexPosition等于0且for循环未运行且未推送新数组时,未添加1导致问题。只需添加一个即可解决问题:-)