2

i am trying to find the name with the lowest number after it, but iterating over it is slow with larger lists. For exaple the expected output should be ["bob", 1] ["jeff", 2] ["wal-E",2]

let items = [["bob",1],["jeff",2],["wal-E",2],["bob",1],["bob",10]]
let items2 = []
let Lowest = 0;
for (y in items){
    for (z in items)
      {
        if (items[y][0] == items[z][0] && items[y][1]<=items[z][1]){
          continue;
        } else if (items[y][0] == items[z][0]){
            Lowest += 1
            if (Lowest >= 2){
            break;
            }
            else {
            continue;
            }
        }
        }      
  if (Lowest == 0){
    items2.push(items[y])
  }
}
console.log(items2);

2
  • 1
    do you have only a single lowest value with same name? do you want only the name? Commented Sep 26, 2021 at 17:46
  • @NinaScholz i want the lowest value for each name Commented Sep 26, 2021 at 18:11

3 Answers 3

5

Using reduce is an elegant solution to acheive this

let items = [["bob",1],["jeff",2],["wal-E",2],["bob",1],["bob",10]];

const lowestItem = items.reduce((a, b) => a[1] < b[1] ? a : b);

console.log(lowestItem);

Read more about Array.prototype.reduce here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

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

1 Comment

i want the lowest value for each name, this gives the lowest value total
3

You could reduce the array and collect the smallest values.

const
    items = [["bob", 1], ["jeff", 2], ["wal-E", 2], ["bob", 1], ["bob", 10]],
    result = Object.entries(items.reduce((r, [name, value]) => {
        if (!(name in r) || r[name] > value) r[name] = value;
        return r;
    }, {}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

2 Comments

thanks this works, would there be a way to get the second-lowest value for each name?
you could collect all values instead of using the min value and map later only the wanted values.
0

You can store the name with the lowest number and the lowest number in two seperate variables, then loop through the array and check whether each array's second item is smaller than the lowest number.

If so, set the lowest number to the second item in the array and the lowest name to the first item in the array.

let items = [["bob",1],["jeff",2],["wal-E",2],["bob",1],["bob",10]]
let lowest;
let lowestName;

items.forEach(e => {
  if(!lowest || e[1] < lowest){
    lowest = e[1];
    lowestName = e[0];
  }
})

console.log(lowestName, lowest)

Comments

Your Answer

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.