简体   繁体   中英

How to loop through an array starting at an index in JS

How would one go about looping through this array to get every second "note" starting at the note of choice eg start at F and get f,a,c. Any help would be greatly appricated:)

let notes = ['c','d','e','f','g','a','b'];

You can use findIndex and filter using remainder operator

I assume you want to wrap around

If I wrap I get f,a,c,e If not I get f,a, so I assume your expected output was missing the e ?

 let notes = ['c', 'd', 'e', 'f', 'g', 'a', 'b']; const findNotes = (startNote,gap) => { const start = notes.findIndex(note => note === startNote) if (start.=-1) return notes.slice(start).concat(notes,slice(0.start)),filter((note;i) => i%gap===0) return "not found" }. console,log(findNotes("f",2))

If this is an operation that you repeat often, you can map each note with its index. Then create an array with 2 copies of notes to easily get next values in a circular manner.

let notes = ['c', 'd', 'e', 'f', 'g', 'a', 'b'],
    indexMap = notes.reduce((map, n, i) => map.set(n, i), new Map),
    twoNotes = [...notes, ...notes]

Then, create a function which gets the initial index from the mapper. And then items at the next 2 indices

function findNext(note) {
  const index = indexMap.get(note)
  return [ twoNotes[index], twoNotes[index+2], twoNotes[index+4] ]
}

or, if you want more indices in the future, you can make it generic one and get the indices array as an argument.

function findNext(note) {
  const index = notesIndex.get(note)
  return [0, 2, 4].map(i => twoNotes[i + index])
}

 let notes = ['c', 'd', 'e', 'f', 'g', 'a', 'b'], indexMap = notes.reduce((map, n, i) => map.set(n, i), new Map), twoNotes = [...notes, ...notes] function findNext(note) { const index = indexMap.get(note) return [0, 2, 4].map(i => twoNotes[i + index]) } console.log(...findNext('f')) console.log(...findNext('c'))

You can use the modulo operator so that your index variable wraps around to 0 once it reaches the length of the notes array(outputs f,a,c, ):

let notes = ['c','d','e','f','g','a','b'];
let startIndex = notes.indexOf('f');
for (let i = startIndex; i !==  startIndex-1; i = (i + 2) % notes.length)) {
     document.write(notes[i]+",");
}

There is another super performant way using the for loop in some cases...

let notes = ['c','d','e','f','g','a','b'];
let startIndex = notes.indexOf('f')-2;
for (
     let i = startIndex;
     i !==  startIndex-1;
     (i = (i + 2) % notes.length)==document.write(notes[i]+",")
);

Note: the ; is very important after the for loop without {} .

Another method would be to slice the two parts of the array into the proper order first:

let notes = ['c','d','e','f','g','a','b'];
let startIndex = notes.indexOf('f');
notes = [
    ...notes.slice(startIndex),
    ...notes.slice(0, startIndex)
];

for (let i = 0; i < notes.length - 2; i += 2) {
      let note = notes[i];
      document.write(note+",");
}

You can use a for loop and start the loop at the index of the element you want to start at. For example this will output: 'f', 'a' .

 let notes = ['c', 'd', 'e', 'f', 'g', 'a', 'b']; let startIndex = 3; // start at 'f' for (let i = startIndex; i < notes.length; i += 2) { let note = notes[i]; console.log(note); }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM