Javascript 배열에 지정된 값과 동일한 속성을 가진 개체가 포함되어 있는지 확인하는 방법은 무엇입니까?

다음과 같은 배열이 있습니다.

vendors = [{
Name: 'Magenic',
ID: 'ABC'
},
{
Name: 'Microsoft',
ID: 'DEF'
} // and so on...
]; 

이 어레이를 체크하여 “Magenic”이 존재하는지 확인하는 방법꼭 해야 하는 경우가 아니라면 루프하고 싶지 않아잠재적으로 수천 장의 음반으로 작업하고 있어요



질문에 대한 답변



적어도 명시적으로 휠 루프를 재창조할 필요는 없습니다(화살표 기능, 최신 브라우저사용).

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.find(e => e.Name === 'Magenic')) {
/* same result as above, but a different function return type */ } 

또한 findIndex를 사용하여 해당 요소의 위치를 확인할 수도 있습니다.

const i = vendors.findIndex(e => e.Name === 'Magenic'); if (i > -1) {
/* vendors contains the element we're looking for, at index "i" */ } 

또, 서투른 브라우저와의 호환성이 필요한 경우는, 다음과 같이 하는 것이 최선책이 있습니다.

if (vendors.filter(function(e) { return e.Name === 'Magenic'; }).length > 0) {
/* vendors contains the element we're looking for */ } 



2018년 편집:이 답변은 브라우저가 어레이 필터링 방법 및 화살표 기능을 광범위하게 지원하기 전인 2011년부터입니다.CAFX의 답변을 보세요.

루프가 없는 어레이에서 무언가를 확인하는 “매직” 방법은 없습니다.어떤 함수를 사용하더라도 함수 자체는 루프를 사용합니다.필요한 것을 찾는 즉시 루프를 벗어나 계산 시간을 최소화할 수 있습니다.

var found = false; for(var i = 0; i < vendors.length; i++) {
if (vendors[i].Name == 'Magenic') {
found = true;
break;
} } 



루프가 필요 없습니다.다음 세 가지 방법이 생각납니다.

Array.protype.some()

이것은 당신의 질문에 대한 가장 정확한 대답입니다. 즉, “뭔가 존재하는지 확인”하는 것으로, bool 결과를 암시합니다.이는 ‘Magenic’ 객체가 있는 경우 true이고 그렇지 않은 경우 false입니다.

let hasMagenicVendor = vendors.some( vendor => vendor['Name'] === 'Magenic' ) 

Array.protype.필터()

이렇게 하면 모든 ‘매지닉’ 객체의 배열이 반환됩니다(단일 요소 배열이 반환됨).

let magenicVendors = vendors.filter( vendor => vendor['Name'] === 'Magenic' ) 

빈 배열(‘Magenic’ 오브젝트 없음)은 아직 truthy이기 때문에 이것을 부울로 강제하려고 해도 동작하지 않습니다.그러니까 그냥 사용하세요magenicVendors.length조건부로요.

Array.protype.find()

그러면 첫 번째 ‘Magenic’ 개체가 반환됩니다(또는undefined없는 경우) :

let magenicVendor = vendors.find( vendor => vendor['Name'] === 'Magenic' ); 

그러면 부울 OK가 강제됩니다(모든 오브젝트는 truthy,undefined거짓입니다).


주의: 벤더 대신 벤더[이름]를 사용하고 있습니다.부동산 이름의 이상한 대문자 때문에 이름이 붙여졌습니다.

주 2: 이름을 확인할 때 엄밀한 등호(===) 대신 느슨한 등호(==)를 사용할 이유가 없습니다.




인정된 답변은 아직 유효하지만 ECMAScript 6 네이티브 메서드가 있습니다.[Array.find][1]그리고.[Array.some][2]같은 효과를 얻을 수 있습니다.

어레이.일부

사용하다some요소가 존재하는지 여부만 판별하려면true/false결정.

MDN 견적:

some() 메서드는 어레이 내의 적어도1개의 요소가 지정된 함수에 의해 구현된 테스트에 합격했는지 여부를 테스트합니다.지정된 함수가 true를 반환하는 요소를 어레이에서 찾으면 true를 반환하고 그렇지 않으면 false를 반환합니다.어레이는 변경되지 않습니다.

Array.find

어레이에서 일치하는 개체를 가져오려면 find를 사용합니다. 그렇지 않으면 반환됩니다.undefined.

MDN 견적:

find() 메서드는 지정된 테스트 함수를 충족하는 지정된 배열의 첫 번째 요소 값을 반환합니다.테스트 함수를 충족하는 값이 없으면 정의되지 않은 값이 반환됩니다.

var arr = [
{
id: 21,
label: 'Banana',
},
{
id: 22,
label: 'Apple',
} ]
/* 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 }
/* note : doesExist is a boolean thats true or false depending on of whether the data was found or not */ var doesExist = arr.some(function(ele) {
return ele.id === 21; });

my jsfiddle 링크를 참조하십시오.모질라에서 제공하는 IE용 폴리필이 있습니다.




내가 할 수 있는 방법은 이렇다.

const found = vendors.some(item => item.Name === 'Magenic'); 

array.some()메서드는 배열에 기준과 일치하는 값이 하나 이상 있는지 확인하고 부울을 반환합니다.이 시점부터, 다음과 같이 할 수 있습니다.

if (found) { // do something } else { // do something else }