Получить ключ массива для подмассива с наибольшим значением

У меня есть массив в javascript с такой структурой:

controllers: Array(2)
    0: Object
        vram: 4095
    1: Object
        vram: 1024

Этот массив генерируется через si.graphics. Подмассивов с разными значениями может быть больше.

Мне нужно как-то вернуть просто индекс контроллера с самым vram. Я нашел другие вопросы о стеке о чем-то похожем, но, по-видимому, только с плоскими массивами, но этот массив является многомерным.

Я не особо старался этого добиться, потому что просто не знаю, с чего начать.

Как я могу получить индекс подмассива с наибольшим количеством vram?

Этот не является дубликатом, потому что он сосредоточен на получении самого высокого значения, что довольно тривиально и не то, о чем я / просил.

Это не массив и не объект

Luca Kiebel 04.05.2018 20:53

@Luca Я не имел в виду, что структура - это то, как создается массив. Просто это текущая структура массива, я просто показываю вам значения и то, как она настроена. Я не спрашиваю, действителен ли массив.

GrumpyCrouton 04.05.2018 20:54

Лучше всего показать массив в допустимом формате. Мы можем довольно легко определить структуру действительного массива.

Cory Kleiser 04.05.2018 20:55

Так в чем же тогда структура? Не могли бы вы добавить минимальный воспроизводимый пример, объясняющее, что вы пробовали, а что не сработало?

Luca Kiebel 04.05.2018 20:55

У массивов нет ключей, а у индексов. однако индексы являются их ключами.

Rikin 04.05.2018 20:56

@ Лука, я это сделал. Это не имеет ничего общего со структурой массива. Я обрисовывал в общих чертах важные значения и показывал, что они являются подмассивом массива.

GrumpyCrouton 04.05.2018 20:56

@Rikin Это, наверное, просто PHP в моем мозгу путает формулировки.

GrumpyCrouton 04.05.2018 20:56

Дайте секунду, собираюсь обновить пост структурой от console.info().

GrumpyCrouton 04.05.2018 20:57

Индексы @Rikin Array являются ключами: Object.keys(['','']) возвращает ["0","1"]

Paul 04.05.2018 20:59

@Paulpro понял. Спасибо за разъяснение. отредактировал.

Rikin 04.05.2018 21:00

в зависимости от варианта использования, я думаю, вам стоит подумать о создании структуры, подобной maxHeap. Я просто не уверен в регулярности вашего варианта использования.

Fallenreaper 04.05.2018 21:04

@Fallenreaper Я не могу изменить структуру, это часть модуля nodejs.

GrumpyCrouton 04.05.2018 21:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
13
50
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Используйте что-то вроде ниже

var controllers = {
    0: {
        vram: 4096
    },
    1: {
        vram: 1024
    },
    2: {
        vram: 1024
    }
};

var max = -999999,
  maxKey = -1;


for(var key in controllers) {
  if (controllers[key]['vram'] > max) {
    max = controllers[key]['vram'];
    maxKey = key;
  }
}

console.info(maxKey);
console.info(max);

Думаю, the index of the sub-array with the most vram значит ему нужен максимум vram и его ключ! @Luca

Saeed 04.05.2018 21:02

Это неверно @ Saeed.Ataee - мне просто нужен индекс.

GrumpyCrouton 04.05.2018 21:17

Используйте только maxKey. В чем проблема? @GrumpyCrouton

Saeed 04.05.2018 21:18

Нет, я просто отвечал на ваш комментарий :)

GrumpyCrouton 04.05.2018 21:19

Если вы просто пытаетесь получить максимальное значение, то следующая функция во фрагменте кода сделает то, что вам нужно:

const myArray = [
  {vram: 100},
  {vram: 200},
  {vram: 150}
]

function getHighestVram(array){
  let highestVram = 0;
  for (i in array){
    if (array[i].vram > highestVram) {
      highestVram = array[i].vram;
    }
  }
  return highestVram;
}
    
const maxVram = getHighestVram(myArray);

console.info(maxVram);

Если вы хотите найти индекс с наивысшим vram, вы можете использовать аналогичную функцию. Как это:

const myArray = [
  {vram: 100},
  {vram: 200},
  {vram: 150}
]

function getHighestVram(array){
  let highestVram = 0;
  let highestVramIndex;
  for (i in array){
    if (array[i].vram > highestVram) {
      highestVram = array[i].vram;
      highestVramIndex = i;
    }
  }
  return highestVramIndex;
}
    
const maxVramIndex = getHighestVram(myArray);

console.info(maxVramIndex);
Ответ принят как подходящий

Вы можете уменьшить массив, проверив значение и значение последнего максимального значения.

var controllers = [{ vram: 4095 }, { vram: 1024 }],
    maxIndex = controllers.reduce(
        (r, { vram }, i, a) => !i || vram > a[r].vram ? i : r,
        undefined
    );

console.info(maxIndex);

Я использовал это в своем проекте. Спасибо.

GrumpyCrouton 04.05.2018 21:19

Просто выполните итерацию объекта controllers и проверьте каждое значение vram, сохраняя всегда самое высокое значение.

let controllers =  [
    {"vram":4095},  // index 0
    {"vram":1024},  // index 1
    {"vram":55555}, // index 2
    {"vram":123}    // index 3...
];

let max = 0;
for(let i in controllers){ 
    if (controllers[i].vram > controllers[max].vram ) max = i
}

console.info(max); // outputs 2

Это был мой первоначальный план, но я хотел знать, есть ли лучший / более эффективный способ. В любом случае, спасибо за ответ!

GrumpyCrouton 04.05.2018 21:21

Другие вопросы по теме