У мене це:
var arr = [0, 21, 22, 7];
Який найкращий спосіб повернути індекс найвищого значення в іншу змінну?
У мене це:
var arr = [0, 21, 22, 7];
Який найкращий спосіб повернути індекс найвищого значення в іншу змінну?
Відповіді:
Це, мабуть, найкращий спосіб, оскільки це надійно і працює на старих браузерах:
function indexOfMax(arr) {
if (arr.length === 0) {
return -1;
}
var max = arr[0];
var maxIndex = 0;
for (var i = 1; i < arr.length; i++) {
if (arr[i] > max) {
maxIndex = i;
max = arr[i];
}
}
return maxIndex;
}
Також є такий однопластовий:
let i = arr.indexOf(Math.max(...arr));
Він виконує вдвічі більше порівнянь, ніж необхідно, і все-таки буде кидати RangeError
великі масиви. Я б дотримувався функції.
const max = arr.reduce((m, n) => Math.max(m, n))
, тоді індекси max [...arr.keys()].filter(i => arr[i] === max)
.
[...arr.keys()]
видає помилку:unexpected token
В одному рядку і, мабуть, швидше arr.indexOf(Math.max.apply(Math, arr))
:
var a = [0, 21, 22, 7];
var indexOfMaxValue = a.reduce((iMax, x, i, arr) => x > arr[iMax] ? i : iMax, 0);
document.write("indexOfMaxValue = " + indexOfMaxValue); // prints "indexOfMaxValue = 2"
Де:
iMax
- найкращий покажчик індексу (індекс максимального елемента до цих пір, на першій ітерації, iMax = 0
оскільки другий аргумент reduce()
є 0
, ми не можемо опустити другий аргумент reduce()
у нашому випадку)x
- перевірений в даний час елемент з масивуi
- перевірений на даний момент індексarr
- наш масив ( [0, 21, 22, 7]
)Про reduce()
метод (з "JavaScript: Постійний посібник" Девіда Фланагана):
Redu () бере два аргументи. Перший - це функція, яка виконує операцію зменшення. Завдання цієї функції скорочення полягає в тому, щоб якось об'єднати або зменшити два значення в одне значення і повернути це зменшене значення.
Функції, які використовуються для зменшення (), відрізняються від функцій, які використовуються для forEach () та map (). Знайоме значення, значення індексу та масиву передаються як другий, третій та четвертий аргументи. Перший аргумент - це накопичений до цього часу результат скорочення. Під час першого виклику функції цей перший аргумент є початковим значенням, яке ви передали як другий аргумент для зменшення (). При наступних викликах це значення, повернене попереднім викликом функції.
Коли ви викликаєте Redu () без початкового значення, він використовує перший елемент масиву як початкове значення. Це означає, що перший виклик функції зменшення матиме перший та другий елементи масиву як перший та другий аргументи.
arr.reduce((bestIndexSoFar, currentlyTestedValue, currentlyTestedIndex, array) => currentlyTestedValue > array[bestIndexSoFar] ? currentlyTestedIndex : bestIndexSoFar, 0);
, яка може бути описана як: ітерація масив , починаючи з індексу 0 (2 - й параметр), якщо currentlyTestedValue вище , ніж значення елемента в bestIndexSoFar , а потім повернути currentlyTestedIndex до наступної ітерації в якості bestIndexSoFar .
this.methods.reduce((methodIndex, currentMethod, currentMethodIndex, methods) => currentMethod.price <= methods[methodIndex].price ? currentMethodIndex : methodIndex, 0)
.
Ось ще одне рішення: Якщо ви використовуєте ES6 за допомогою оператора спред:
var arr = [0, 21, 22, 7];
const indexOfMaxValue = arr.indexOf(Math.max(...arr));
Якщо я не помиляюся, я б сказав, що це написати власну функцію.
function findIndexOfGreatest(array) {
var greatest;
var indexOfGreatest;
for (var i = 0; i < array.length; i++) {
if (!greatest || array[i] > greatest) {
greatest = array[i];
indexOfGreatest = i;
}
}
return indexOfGreatest;
}
reduce
:[1,2,5,0,4].reduce((a,b,i) => a[0] < b ? [b,i] : a, [Number.MIN_VALUE,-1])
//[5,2]
Це повертається, [5e-324, -1]
якщо масив порожній. Якщо ви хочете просто індекс, поставте [1]
після.
>
та MAX_VALUE
):[1,2,5,0,4].reduce((a,b,i) => a[0] > b ? [b,i] : a, [Number.MAX_VALUE,-1])
//[0, 3]
EDIT: Роки тому я дав відповідь на це, що було грубим, занадто конкретним і занадто складним. Тому я її редагую. Я віддаю перевагу функціональним відповідям вище за їх акуратний фактор, але не їх читабельність; але якби я був більш знайомий з JavaScript, то, можливо, вони мені також сподобаються за це.
Псевдокод:
Індекс треку, який містить найбільше значення. Припустимо, індекс 0 є найбільшим спочатку. Порівняйте з поточним індексом. Оновіть індекс з найбільшим значенням, якщо необхідно.
Код:
var mountains = [3, 1, 5, 9, 4];
function largestIndex(array){
var counter = 1;
var max = 0;
for(counter; counter < array.length; counter++){
if(array[max] < array[counter]){
max = counter;
}
}
return max;
}
console.log("index with largest value is: " +largestIndex(mountains));
// index with largest value is: 3
function findIndicesOf(haystack, needle)
{
var indices = [];
var j = 0;
for (var i = 0; i < haystack.length; ++i) {
if (haystack[i] == needle)
indices[j++] = i;
}
return indices;
}
перейти array
до haystack
і Math.max(...array)
до needle
. Це дасть усі максимальні елементи масиву, і він буде більш розширюваним (наприклад, вам також потрібно знайти мінімальні значення)
Якщо ви створите копію масиву і сортуєте її у порядку зменшення, перший елемент копії буде найбільшим. Тоді ви можете знайти його індекс у вихідному масиві.
var sorted = [...arr].sort((a,b) => b - a)
arr.indexOf(sorted[0])
Часова складність становить O (n) для копії, O (n * log (n)) для сортування та O (n) для indexOf.
Якщо вам потрібно зробити це швидше, відповідь Ry - це O (n).
var arr=[0,6,7,7,7];
var largest=[0];
//find the largest num;
for(var i=0;i<arr.length;i++){
var comp=(arr[i]-largest[0])>0;
if(comp){
largest =[];
largest.push(arr[i]);
}
}
alert(largest )//7
//find the index of 'arr'
var arrIndex=[];
for(var i=0;i<arr.length;i++){
var comp=arr[i]-largest[0]==0;
if(comp){
arrIndex.push(i);
}
}
alert(arrIndex);//[2,3,4]
Стабільна версія цієї функції виглядає так:
// not defined for empty array
function max_index(elements) {
var i = 1;
var mi = 0;
while (i < elements.length) {
if (!(elements[i] < elements[mi]))
mi = i;
i += 1;
}
return mi;
}
Простий
maxarr: function(){
let maxval = 0;
let maxindex = null;
for (i = 0; i < arr.length; i++){
if (arr[i] > maxval) {
maxval = arr[i];
maxindex = i;
}
}
}