У меня есть массив в javascript с такой структурой:
controllers: Array(2)
0: Object
vram: 4095
1: Object
vram: 1024
Этот массив генерируется через si.graphics. Подмассивов с разными значениями может быть больше.
Мне нужно как-то вернуть просто индекс контроллера с самым vram. Я нашел другие вопросы о стеке о чем-то похожем, но, по-видимому, только с плоскими массивами, но этот массив является многомерным.
Я не особо старался этого добиться, потому что просто не знаю, с чего начать.
Как я могу получить индекс подмассива с наибольшим количеством vram?
Этот не является дубликатом, потому что он сосредоточен на получении самого высокого значения, что довольно тривиально и не то, о чем я / просил.
@Luca Я не имел в виду, что структура - это то, как создается массив. Просто это текущая структура массива, я просто показываю вам значения и то, как она настроена. Я не спрашиваю, действителен ли массив.
Лучше всего показать массив в допустимом формате. Мы можем довольно легко определить структуру действительного массива.
Так в чем же тогда структура? Не могли бы вы добавить минимальный воспроизводимый пример, объясняющее, что вы пробовали, а что не сработало?
У массивов нет ключей, а у индексов. однако индексы являются их ключами.
@ Лука, я это сделал. Это не имеет ничего общего со структурой массива. Я обрисовывал в общих чертах важные значения и показывал, что они являются подмассивом массива.
@Rikin Это, наверное, просто PHP в моем мозгу путает формулировки.
Дайте секунду, собираюсь обновить пост структурой от console.info().
Индексы @Rikin Array являются ключами: Object.keys(['','']) возвращает ["0","1"]
@Paulpro понял. Спасибо за разъяснение. отредактировал.
Возможный дубликат Нахождение максимального значения атрибута в массиве объектов
в зависимости от варианта использования, я думаю, вам стоит подумать о создании структуры, подобной maxHeap. Я просто не уверен в регулярности вашего варианта использования.
@Fallenreaper Я не могу изменить структуру, это часть модуля nodejs.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте что-то вроде ниже
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.Ataee - мне просто нужен индекс.
Используйте только maxKey. В чем проблема? @GrumpyCrouton
Нет, я просто отвечал на ваш комментарий :)
Если вы просто пытаетесь получить максимальное значение, то следующая функция во фрагменте кода сделает то, что вам нужно:
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);Я использовал это в своем проекте. Спасибо.
Просто выполните итерацию объекта 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Это был мой первоначальный план, но я хотел знать, есть ли лучший / более эффективный способ. В любом случае, спасибо за ответ!
Это не массив и не объект