user122222
user122222

Reputation: 2419

Find index of last matching occurrence

I've got array of variables and next variable which I want to add alphabetically. It goes A-Z and after that AA, AB, AC etc.. so in when next variable is E I want to add it at the end of letters with length=1, if next variable would be AC I'd add it at the end on letters with length=2 etc. I tried to do it with findIndex, but it returns the first occurrence, not the last one and lastIndexOf accepts value while in my case it should be the last element with given length.

let variables = ['A', 'B', 'C', 'D', 'AA', 'AB'];
const nextVariable = 'E';
const idx = variables.findIndex(x => x.length === nextVariable.length);
variables.splice(idx, 0, nextVariable);
console.log(variables);

// should be ['A', 'B', 'C', 'D', 'E', 'AA', 'AB']

Upvotes: 0

Views: 174

Answers (3)

Romi Halasz
Romi Halasz

Reputation: 2009

You can use a custom sort function and test the alphabetical order and length of each value.

function mySort(a, b) {
  if(a.length == b.length) {
    return a.localeCompare(b);
  } else {
    return a.length - b.length;
  }
}

The you can use this function to sort the array after a new value has been added:

variables.sort(mySort);

Upvotes: 1

kooskoos
kooskoos

Reputation: 4859

let variables = ['A', 'B', 'C', 'D', 'AA', 'AB'];
const nextVariable = 'E';
variables[variables.length] = nextVariable
variables = variables.sort((x,y) => x.length<y.length ? -1 : x.length==y.length ? x.localeCompare(y) : 1)
console.log(variables);

Upvotes: 1

Nick
Nick

Reputation: 147146

You can just look for the first variable which is longer than the variable to insert, and if it doesn't exist (findIndex returns -1), add to the end of the array:

let variables = ['A', 'B', 'C', 'D', 'AA', 'AB'];
let nextVariable = 'E';
let idx = variables.findIndex(x => x.length > nextVariable.length);
variables.splice(idx < 0 ? variables.length : idx, 0, nextVariable);
// should be ['A', 'B', 'C', 'D', 'E', 'AA', 'AB']
console.log(variables);
nextVariable = 'AC';
idx = variables.findIndex(x => x.length > nextVariable.length);
variables.splice(idx < 0 ? variables.length : idx, 0, nextVariable);
// should be ['A', 'B', 'C', 'D', 'E', 'AA', 'AB', 'AC']
console.log(variables);

Upvotes: 1

Related Questions