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

나는 같은 배열을 가지고있다.

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발견되지 않은 경우.