나는 같은 배열을 가지고있다.
vendors = [
{
Name: 'Magenic',
ID: 'ABC'
},
{
Name: 'Microsoft',
ID: 'DEF'
} //and so on goes array...
];
Magenic이 존재하는지 확인하려면이 배열을 어떻게 확인합니까? 내가하지 않으면 루프를하고 싶지 않습니다. 잠재적으로 2 천 개의 레코드로 작업하고 있습니다.
업데이트
이것은 인기있는 게시물이기 때문에 내가 찾은 새로운 것을 나눌 것이라고 생각했습니다. @CAFxX가 이미 이것을 공유 한 것으로 보입니다! 나는 이것을 더 자주 읽어야한다. 나는 우연히 https://benfrain.com/understanding-native-javascript-array-methods/ .
vendors.filter(function(vendor){ return vendor.Name === "Magenic" })
그리고 함께 ECMAScript를 2015 은 새로운 화살표 기능을 사용하는 경우에도 간단하다 :
vendors.filter(vendor => vendor.Name === "Magenic")
답변
2018 편집 :이 답변은 브라우저가 배열 필터링 방법과 화살표 기능을 광범위하게 지원하기 전에 2011 년입니다. CAFxX의 답변을 살펴보십시오 .
루프가없는 배열에서 무언가를 확인하는 “마법”방법은 없습니다. 함수를 사용하더라도 함수 자체는 루프를 사용합니다. 계산 시간을 최소화하기 위해 원하는 것을 찾 자마자 루프를 벗어나는 것이 가능합니다.
var found = false;
for(var i = 0; i < vendors.length; i++) {
if (vendors[i].Name == 'Magenic') {
found = true;
break;
}
}
답변
다시 발명 할 필요가 없습니다 바퀴최소한 명시 적으로 루프하지 마십시오 ( 화살표 기능 사용 , 최신 브라우저에만 해당 ) :
if (vendors.filter(e => e.Name === 'Magenic').length > 0) {
/* vendors contains the element we're looking for */
}
또는 더 나은 아직 :
if (vendors.some(e => e.Name === 'Magenic')) {
/* vendors contains the element we're looking for */
}
편집 : 당신이 거친 브라우저와의 호환성이 필요하면 가장 좋은 방법은 다음과 같습니다.
if (vendors.filter(function(e) { return e.Name === 'Magenic'; }).length > 0) {
/* vendors contains the element we're looking for */
}
답변
루프가 필요하지 않습니다. 생각 나는 세 가지 방법 :
Array.prototype.some ()
이것은 귀하의 질문에 대한 가장 정확한 답변입니다. 즉, “뭔가 있는지 확인하십시오”는 잘못된 결과를 암시합니다. ‘Magenic’객체가 있으면 true이고, 그렇지 않으면 false입니다.
let hasMagenicVendor = vendors.some( vendor => vendor['Name'] === 'Magenic' )
Array.prototype.filter ()
하나만있는 경우에도 모든 ‘Magenic’객체의 배열을 반환합니다 (한 요소의 배열을 반환 함).
let magenicVendors = vendors.filter( vendor => vendor['Name'] === 'Magenic' )
이것을 부울로 강제하려고하면 빈 배열 ( ‘Magenic’객체 없음)이 여전히 진실이기 때문에 작동하지 않습니다. magenicVendors.length
조건부에서 사용 하십시오.
Array.prototype.find ()
첫 번째 ‘Magenic’객체를 반환합니다 ( undefined
없는 경우).
let magenicVendor = vendors.find( vendor => vendor['Name'] === 'Magenic' );
이것은 부울 괜찮아로 강제합니다 (모든 물건이 진실하고 undefined
거짓입니다).
참고 : 속성 이름이 이상한 경우 vendor.Name 대신 vendor [ “Name”]를 사용하고 있습니다.
참고 2 : 이름을 확인할 때 엄격한 동등 (===) 대신 느슨한 동등 (==)을 사용할 이유가 없습니다.
답변
받아 들여진 대답은 여전히 작동하지만 이제 [Array.find][1]
동일한 효과를 얻는 ECMAScript 6 기본 방법 이 있습니다.
인용 MDN :
find () 메소드는 제공된 테스트 기능을 만족하는 배열의 첫 번째 요소 값을 리턴합니다. 그렇지 않으면 undefined가 반환됩니다.
var arr = [];
var item = {
id: '21',
step: 'step2',
label: 'Banana',
price: '19$'
};
arr.push(item);
/* note : data is the actual object that matched search criteria
or undefined if nothing matched */
var data = arr.find( function( ele ) {
return ele.id === '21';
} );
if( data ) {
console.log( 'found' );
console.log(data); // This is entire object i.e. `item` not boolean
}
내 jsfiddle 링크 보기 mozilla가 제공하는 IE 용 polyfill이 있습니다.
답변
내가 할 방법은 다음과 같습니다
const found = vendors.some(item => item.Name === 'Magenic');
array.some()
메소드는 기준과 일치하는 배열에 하나 이상의 값이 있는지 확인하고 부울을 리턴합니다. 여기에서 당신은 함께 갈 수 있습니다 :
if (found) {
// do something
} else {
// do something else
}
답변
다음과 같이 재구성하지 않는 한 :
vendors = {
Magenic: {
Name: 'Magenic',
ID: 'ABC'
},
Microsoft: {
Name: 'Microsoft',
ID: 'DEF'
} and so on...
};
당신이 할 수있는 if(vendors.Magnetic)
당신은 루프해야합니다
답변
ECMAScript 6 사양에 따라을 사용할 수 있습니다 findIndex
.
const magenicIndex = vendors.findIndex(vendor => vendor.Name === 'Magenic');
magenicIndex
어느 개최 0
(인덱스 배열이다) 또는 -1
발견되지 않은 경우.