Tôi có cái này:
var arr = [0, 21, 22, 7];
Cách tốt nhất để trả chỉ số của giá trị cao nhất vào một biến khác là gì?
Tôi có cái này:
var arr = [0, 21, 22, 7];
Cách tốt nhất để trả chỉ số của giá trị cao nhất vào một biến khác là gì?
Câu trả lời:
Đây có lẽ là cách tốt nhất, vì nó đáng tin cậy và hoạt động trên các trình duyệt cũ:
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;
}
Ngoài ra còn có một lớp lót này:
let i = arr.indexOf(Math.max(...arr));
Nó thực hiện gấp đôi số lần so sánh khi cần thiết và sẽ đưa ra một RangeError
mảng lớn. Tôi sẽ bám vào chức năng.
const max = arr.reduce((m, n) => Math.max(m, n))
, sau đó các chỉ số của max là [...arr.keys()].filter(i => arr[i] === max)
.
[...arr.keys()]
xuất ra một lỗi:unexpected token
Trong một dòng và có thể nhanh hơn sau đó 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"
Ở đâu:
iMax
- chỉ mục tốt nhất cho đến nay (chỉ mục của phần tử max cho đến nay, trong lần lặp đầu tiên iMax = 0
vì đối số thứ hai reduce()
là 0
, chúng ta không thể bỏ qua đối số thứ hai reduce()
trong trường hợp của chúng ta)x
- phần tử hiện đang được thử nghiệm từ mảngi
- chỉ số hiện đang được thử nghiệmarr
- mảng của chúng tôi ( [0, 21, 22, 7]
)Về reduce()
phương pháp (từ "JavaScript: Hướng dẫn dứt khoát" của David Flanagan):
giảm () mất hai đối số. Đầu tiên là chức năng thực hiện các hoạt động giảm. Nhiệm vụ của hàm giảm này là bằng cách nào đó kết hợp hoặc giảm hai giá trị thành một giá trị duy nhất và trả về giá trị giảm đó.
Các hàm được sử dụng với less () khác với các hàm được sử dụng với forEach () và map (). Giá trị quen thuộc, chỉ mục và giá trị mảng được truyền dưới dạng đối số thứ hai, thứ ba và thứ tư. Đối số đầu tiên là kết quả tích lũy của việc giảm cho đến nay. Trong lệnh gọi đầu tiên đến hàm, đối số đầu tiên này là giá trị ban đầu bạn đã chuyển làm đối số thứ hai để giảm (). Trong các cuộc gọi tiếp theo, nó là giá trị được trả về bởi lệnh gọi trước đó của hàm.
Khi bạn gọi less () không có giá trị ban đầu, nó sử dụng phần tử đầu tiên của mảng làm giá trị ban đầu. Điều này có nghĩa là lệnh gọi đầu tiên đến hàm rút gọn sẽ có các phần tử mảng thứ nhất và thứ hai làm đối số thứ nhất và thứ hai.
arr.reduce((bestIndexSoFar, currentlyTestedValue, currentlyTestedIndex, array) => currentlyTestedValue > array[bestIndexSoFar] ? currentlyTestedIndex : bestIndexSoFar, 0);
, có thể được mô tả như: lặp mảng bắt đầu từ chỉ số 0 (tham số thứ 2), nếu currentlyTestedValue là cao hơn giá trị của phần tử tại bestIndexSoFar , sau đó trả lại currentlyTestedIndex đến phiên bản kế tiếp như bestIndexSoFar .
this.methods.reduce((methodIndex, currentMethod, currentMethodIndex, methods) => currentMethod.price <= methods[methodIndex].price ? currentMethodIndex : methodIndex, 0)
.
Đây là một giải pháp khác, Nếu bạn đang sử dụng ES6 bằng toán tử trải rộng:
var arr = [0, 21, 22, 7];
const indexOfMaxValue = arr.indexOf(Math.max(...arr));
Trừ khi tôi nhầm, tôi sẽ nói đó là viết chức năng của riêng bạn.
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]
Điều này trả về [5e-324, -1]
nếu mảng trống. Nếu bạn chỉ muốn chỉ mục, đặt [1]
sau.
>
và MAX_VALUE
):[1,2,5,0,4].reduce((a,b,i) => a[0] > b ? [b,i] : a, [Number.MAX_VALUE,-1])
//[0, 3]
EDIT: Nhiều năm trước tôi đã đưa ra một câu trả lời cho điều này quá thô thiển, quá cụ thể và quá phức tạp. Vì vậy, tôi đang chỉnh sửa nó. Tôi ủng hộ các câu trả lời chức năng ở trên cho yếu tố gọn gàng của họ nhưng không dễ đọc; nhưng nếu tôi quen thuộc hơn với javascript thì tôi cũng có thể thích chúng vì điều đó.
Mã giả:
Theo dõi chỉ số có chứa giá trị lớn nhất. Giả sử chỉ số 0 là lớn nhất ban đầu. So sánh với chỉ số hiện tại. Cập nhật chỉ số với giá trị lớn nhất nếu cần thiết.
Mã số:
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;
}
vượt qua array
để haystack
và Math.max(...array)
để needle
. Điều này sẽ cung cấp cho tất cả các phần tử tối đa của mảng và nó có thể mở rộng hơn (ví dụ: bạn cũng cần tìm các giá trị tối thiểu)
Nếu bạn tạo một bản sao của mảng và sắp xếp nó giảm dần, phần tử đầu tiên của bản sao sẽ là phần lớn nhất. Hơn bạn có thể tìm thấy chỉ mục của nó trong mảng ban đầu.
var sorted = [...arr].sort((a,b) => b - a)
arr.indexOf(sorted[0])
Độ phức tạp thời gian là O (n) cho bản sao, O (n * log (n)) để sắp xếp và O (n) cho indexOf.
Nếu bạn cần làm nhanh hơn, câu trả lời của Ry là 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]
Một phiên bản ổn định của chức năng này trông như thế này:
// 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;
}
Đơn giản
maxarr: function(){
let maxval = 0;
let maxindex = null;
for (i = 0; i < arr.length; i++){
if (arr[i] > maxval) {
maxval = arr[i];
maxindex = i;
}
}
}