배열에서 모든 요소의 색인을 찾는 방법은 무엇입니까?
JavaScript 배열에서 "Nano"와 같은 요소의 모든 인스턴스의 인덱스를 찾으려고합니다.
var Cars = ["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"];
jQuery.inArray 또는 유사하게 .indexOf ()를 시도했지만 요소의 마지막 인스턴스의 인덱스 (이 경우 5) 만 제공했습니다.
모든 인스턴스에 대해 어떻게 얻습니까?
이 .indexOf()
메서드 에는 검색을 시작할 인덱스를 지정하는 선택적 두 번째 매개 변수가 있으므로 루프에서 호출하여 특정 값의 모든 인스턴스를 찾을 수 있습니다.
function getAllIndexes(arr, val) {
var indexes = [], i = -1;
while ((i = arr.indexOf(val, i+1)) != -1){
indexes.push(i);
}
return indexes;
}
var indexes = getAllIndexes(Cars, "Nano");
인덱스를 사용하려는 방법을 명확하게 밝히지 않았으므로 내 함수는 인덱스를 배열로 반환합니다 (또는 값을 찾을 수없는 경우 빈 배열을 반환).하지만 개별 인덱스 값으로 다른 작업을 수행 할 수 있습니다. 루프 내부.
업데이트 : VisioN의 설명에 따라 간단한 for 루프는 동일한 작업을 더 효율적으로 수행 할 수 있으며 이해하기 쉽고 유지 관리가 더 쉽습니다.
function getAllIndexes(arr, val) {
var indexes = [], i;
for(i = 0; i < arr.length; i++)
if (arr[i] === val)
indexes.push(i);
return indexes;
}
또 다른 대안은 다음을 사용하는 것입니다 Array.prototype.reduce()
.
["Nano","Volvo","BMW","Nano","VW","Nano"].reduce(function(a, e, i) {
if (e === 'Nano')
a.push(i);
return a;
}, []); // [0, 3, 5]
주의 : 방법에 대한 브라우저 호환성 을 확인하고 필요한 경우 polyfill을reduce
사용 하십시오 .
Array.prototype.map () 및 Array.prototype.filter ()를 사용하는 또 다른 방법 :
var indices = array.map((e, i) => e === value ? i : '').filter(String)
map
및 filter
다음 을 모두 사용하여 이에 대한 간단하고 읽기 쉬운 솔루션을 작성할 수 있습니다 .
const nanoIndexes = Cars
.map((car, i) => car === 'Nano' ? i : -1)
.filter(index => index !== -1);
편집 : IE / Edge를 지원할 필요가 없거나 코드를 트랜스 파일 할 필요가없는 경우 ES2019는 flatMap을 제공 하여 간단한 한 줄 로이 작업을 수행 할 수 있습니다.
const nanoIndexes = Cars.flatMap((car, i) => car === 'Nano' ? i : []);
es6 스타일로 더 간단한 방법.
const indexOfAll = (arr, val) => arr.reduce((acc, el, i) => (el === val ? [...acc, i] : acc), []);
//Examples:
var Cars = ["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"];
indexOfAll(cars, "Nano"); //[0, 3, 5]
indexOfAll([1, 2, 3, 1, 2, 3], 1); // [0,3]
indexOfAll([1, 2, 3], 4); // []
참고 : MDN은 while 루프를 사용하는 방법을 제공합니다 .
var indices = [];
var array = ['a', 'b', 'a', 'c', 'a', 'd'];
var element = 'a';
var idx = array.indexOf(element);
while (idx != -1) {
indices.push(idx);
idx = array.indexOf(element, idx + 1);
}
나는 그것이 다른 답변보다 낫다고 말하지 않을 것입니다. 흥미 롭습니다.
다른 쉬운 방법으로 업데이트하고 싶습니다.
forEach 메서드를 사용할 수도 있습니다.
var Cars = ["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"];
var result = [];
Cars.forEach((car, index) => car === 'Nano' ? result.push(index) : null)
이것은 나를 위해 일했습니다.
let array1 = [5, 12, 8, 130, 44, 12, 45, 12, 56];
let numToFind = 12
let indexesOf12 = [] // the number whose occurrence in the array we want to find
array1.forEach(function(elem, index, array) {
if (elem === numToFind) {indexesOf12.push(index)}
return indexesOf12
})
console.log(indexesOf12) // outputs [1, 5, 7]
const indexes = cars
.map((car, i) => car === "Nano" ? i : null)
.filter(i => i !== null)
스택을 사용하고 "arr [i] == value"조건이 발생할 때마다 "i"를 스택에 푸시 할 수 있습니다.
이것을 확인하십시오 :
static void getindex(int arr[], int value)
{
Stack<Integer>st= new Stack<Integer>();
int n= arr.length;
for(int i=n-1; i>=0 ;i--)
{
if(arr[i]==value)
{
st.push(i);
}
}
while(!st.isEmpty())
{
System.out.println(st.peek()+" ");
st.pop();
}
}
다른 방법을 공유 하기 위해 함수 생성기 를 사용 하여 결과를 얻을 수도 있습니다.
function findAllIndexOf(target, needle) {
return [].concat(...(function*(){
for (var i = 0; i < target.length; i++) if (target[i] === needle) yield [i];
})());
}
var target = "hellooooo";
var target2 = ['w','o',1,3,'l','o'];
console.log(findAllIndexOf(target, 'o'));
console.log(findAllIndexOf(target2, 'o'));
findIndex
콜백 출력과 일치하는 첫 번째 색인 만 검색합니다. findIndexes
Array를 확장 한 다음 배열을 새 구조로 캐스팅 하여 직접 구현할 수 있습니다 .
class EnhancedArray extends Array {
findIndexes(where) {
return this.reduce((a, e, i) => (where(e, i) ? a.concat(i) : a), []);
}
}
/*----Working with simple data structure (array of numbers) ---*/
//existing array
let myArray = [1, 3, 5, 5, 4, 5];
//cast it :
myArray = new EnhancedArray(...myArray);
//run
console.log(
myArray.findIndexes((e) => e===5)
)
/*----Working with Array of complex items structure-*/
let arr = [{name: 'Ahmed'}, {name: 'Rami'}, {name: 'Abdennour'}];
arr= new EnhancedArray(...arr);
console.log(
arr.findIndexes((o) => o.name.startsWith('A'))
)
밑줄 / 로대시를 사용하려면 다음을 수행 할 수 있습니다.
var Cars = ["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"];
_.chain(Cars).map((v, i)=> [i, v === "Nano"]).filter(v=>v[1]).map(v=>v[0]).value()
[0, 3, 5]
'Programing' 카테고리의 다른 글
PHP에서 매개 변수로 함수 허용 (0) | 2020.09.02 |
---|---|
형식화 된 BigDecimal 값을 인쇄하는 방법은 무엇입니까? (0) | 2020.09.02 |
이 오류가 발생하는 이유 : 다음 EntitySet / AssociationSet-Entity1에 대해 지정된 매핑이 없습니까? (0) | 2020.09.02 |
VisualVM에 JVM 인수를 어떻게 제공합니까? (0) | 2020.09.02 |
현재 사용자 디렉토리는 어떻게 얻을 수 있습니까? (0) | 2020.09.02 |