我一直在瀏覽網站,我發現的所有問題都是關於查找數組中值的索引的問題,但該值是該數組中值的唯一出現次數。我想知道是否有一種方法可以在每次出現重複值時找到索引。查找數組中值的索引
說有和數組,像這樣:
var arr = [45,56,76,4,53,43,6,273,884,69,47,58,225,222,23,13,89,900,7,66,78,74,69];
是否可以遍歷這個並找到值69的指標?
我一直在瀏覽網站,我發現的所有問題都是關於查找數組中值的索引的問題,但該值是該數組中值的唯一出現次數。我想知道是否有一種方法可以在每次出現重複值時找到索引。查找數組中值的索引
說有和數組,像這樣:
var arr = [45,56,76,4,53,43,6,273,884,69,47,58,225,222,23,13,89,900,7,66,78,74,69];
是否可以遍歷這個並找到值69的指標?
當然這是可能的。電腦很棒。
var positions = [];
for (var i = 0; i < arr.length; ++i)
if (arr[i] === 69)
positions.push(i);
在循環結束時,數組「位置」將包含找到69的數組的所有索引。
你可以概括如下:
function indexes(arr, value) {
var rv = [];
for (var i = 0; i < arr.length; ++i)
if (arr[i] === value)
rv.push(i);
return rv;
}
然後:
var i69 = indexes(arr, 69);
第一行+1! –
這裏有一個辦法做到這一點在現代瀏覽器:
function findIndexes(arr, val){
return arr.map(function(v,i){ return v==val && i }).filter(Number);
}
console.log(findIndexes(arr, 69)); //=> [9,22]
或者'.filter()'而不是'.map()'? ...哎呀,不,這不行。 –
@瘋狂火車:你會怎麼做?您需要以某種方式映射索引,'filter'期望您返回'true/thy'或'false/y'。我錯過了什麼嗎? – elclanrs
只有我的評論的更新。我沒有考慮指數。 –
循環while
下一indexOf
不-1
..
function allIndicesOf(arr, val) {
var found = [], i = -1;
while (-1 !== (i = arr.indexOf(val, i + 1))) found.push(i);
return found;
}
var arr = [0, 1, 2, 3, 2, 1, 8, 5, 2, 0, 4, 3, 3, 1];
allIndicesOf(arr, 3); // [3, 11, 12]
啊,我剛剛發佈了幾乎相同的例子。即使是在'while'頭部的任務。 +1 –
@CrazyTrain當我一行'while'循環並且它按照期望工作時,我總覺得我已經取得了一些特殊的東西。 –
既然我們都張貼各種方式來完成簡單的任務...
var arr = [45,56,76,4,53,43,6,273,884,69,47,58,225,222,23,13,89,900,7,66,78,74,69];
arr.reduce(function(res, n, i) {
return n === 69 ? res.concat(i) : res;
}, []);
+1創造力。我玩的是類似的智慧,但最終發佈了「map | filter」解決方案。 – elclanrs
我唯一不喜歡的就是常量'.concat()'。讓我感到骯髒。雖然看起來確實比「if」陳述更好。 –
你可以使用_reduce_,_charCodeAt_和_Array_在[這個問題]中做一些簡潔的事情(http://stackoverflow.com/questions/17845584/converting-a-random-string-into-a-hex-colour ),這不會像我在那裏的答案那樣瘋狂。 –
我的想法
function indexs(arr,val){
var start = arr.indexOf(val),result = [];
while(start >= 0){
result.push(start);
start = arr.indexOf(val,start+1);
}
return result;
}
玩得開心:)
var arr = [45,56,76,4,53,43,6,273,884,69,47,58,225,222,23,13,89,900,7,66,78,74,69],
i = arr.length,
o = {};
while(i--) {
if(!o[ arr[i] ]) {
`o[ arr[i] ] = [];`
}
o[ arr[i] ].push(i);
}
alert(o[69]);
要格式化您的代碼,只需選擇整個代碼塊,然後單擊編輯區域上方的**按鈕。{} –
循環會首先您將學習基本的編程教程。 –