2016-06-12 5 views
2

속성에있을 수있는 특정 값으로 객체 배열을 필터링하는 방법이 있습니까? 나는 그러나이의 값으로 "이"이 두 개체 중 하나를 반환값을 기반으로 객체 배열 필터링

x.filter(function(y){ return y.name == "two"; }); 

을 할 수 Array.prototype.filter

var x = [ 
    { 
     name: "one", 
     swp: "two" 
    }, 
    { 
     name: "two", 
     swp: "three" 
    }, 
    { 
     name: "aa", 
     swp: "bb" 
    } 
]; 

:

의 내가이 객체가 있다고 가정 해 봅시다 그들의 속성 중 하나.

function findValue(value) { 
    var y = []; 
    for (obj in x) { 
    for (val in x[obj]) { 
     if (x[obj][val].match(value)) { 
     y.push(x[obj]); 
     } 
    } 
    } 
    return y; 
} 

반면 작업을 수행하지만, 무력 접근 방식입니다. 동일한 결과를 얻는 더 좋은 방법이 있습니까?

답변

4
var arrOfObj = []; // objects you're sifting 
var prop = 'whatever'; 

var matches = arrOfObj.filter(obj => Object.keys(obj).some(k => obj[k] === prop)); 

당신은 Array.prototype.filter하고 배열의 요소 중 하나가 조건에 일치하는 경우 부울을 반환 Array.prototype.some의 조합을 원하는, 또한 (각 개체의 키가이 경우) 가능한 한 빨리 배열을 반복 중지 그것은 성냥을 찾습니다. 당신은 크로스 브라우저 지원이 필요 (그리고 어떤 이유로 바벨을 사용하지 않는) 위의 ES 5 버전

var arrOfObj = []; // objects you're sifting 
var prop = 'whatever'; 

var matches = arrOfObj.filter(function(obj) { 
    return Object.keys(obj).some(function(k) { 
    return obj[k] === prop; 
    }); 
}); 
+0

@nnnnnn 캐치 감사합니다. –

+0

OP 코드와 일치시키기 위해 ES5 버전을 포함 할 수 있습니다. – 1983

3

경우 잘 분명한 것은 당신의 .filter() 기능으로 for..in 루프를 결합하는 것입니다 :

var x = [{name: "one", swp: "two"}, {name: "two", swp: "three"}, { name: "aa", swp: "bb"}]; 
 

 
var filtered = x.filter(function(v) { 
 
    for (var k in v) 
 
    if (v[k] === "two") return true; 
 
}); 
 
console.log(filtered);

3

개별 속성을 확인하는 내부 루프 방법을 사용

0 값
관련 문제