create element at index position if index does not exist in array

Multi tool use
Multi tool use


create element at index position if index does not exist in array



I have an array objects that hold an id and a name


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: ''
}];



Further I have an array that holds numbers.


const indexPositions = [0, 1, 2, 2, 2, 3, 2, 0];



I want to create a third array that holds arrays. Each number in distances represents the index of the current array within the array.


distances



If the current array does not exist yet I want to create it first. Obviously I have to create new arrays until I get to this index position.



Example:
My array is empty at start. The first index position is 0 so I have to create a new array for this. The next index position is 3 so I have to create more arrays until I have 4 arrays.



All I want to do is to push the stage to its correct level index position. The result of this example would be


const levels = [
[stage1, stage8],
[stage2],
[stage3, stage4, stage5, stage7],
[stage6]
];



Currently my code looks this


$(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);
});
});



I get this error Uncaught TypeError: Cannot read property 'push' of undefined and this happens because the indexPosition is out of bounds. If the positionDifference is 0 no array gets created but in the beginning the array is empty.


Uncaught TypeError: Cannot read property 'push' of undefined


positionDifference



I tried setting levels.length to -1 if it is 0 but I still get the error if the difference is 1, I create one array at position 0 and want to access position 1.


levels.length



How can I create an empty array if it does not exist?




3 Answers
3



While I do not fully understand what you want to do, checking existence of an array element is simple, one way of doing that is coercing it to boolean:




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);



(The indices are deliberately non-continuous, because that does not matter: JavaScript arrays are sparse)





oh well, this looks easy
– Matthias Hermsen
Jul 2 at 9:34



You could use a single loop and add an array for the index if not exists. Then push the wanted value.




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; }



You actually were very close! You have a very small issue in your code.


$(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);
});
});



When you were calculating the positionDifference, you did not add 1 causing the problem when indexPosition equaled 0 and the for loop did not run and no new arrays were pushed. Just adding one fixed the problem :-)






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

k2ULXH,3NyYdK09IWuhK,2cKQV1469vFlHNAdTyFhfli,1tnKPm3t,7,5 9c w
8dqeM l8ACkaVDoUiXsIOlHnbuS

Popular posts from this blog

Rothschild family

Cinema of Italy