1

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.

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.

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.

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

3 Answers 3

2

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)

Sign up to request clarification or add additional context in comments.

1 Comment

oh well, this looks easy
0

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

Comments

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.