2017-09-06 6 views
1

js 또는 jquery에서 객체 배열을 필터링하고 특정 속성 이름이있는 객체의 배열을 반환하려고합니다. 이상 find 시작의 각 반복하고 다시 한번 arr를 정의하기 때문에이 작업을 나던 그러나JS - 속성 값 배열로 객체 배열 필터링 및 필터링 된 객체 배열 반환

result = [{a:1}, {a:2}] 

:

var objs = [{ a:1, }, {a:2}, {a:3}, {a:4}] 
var vals = [1, 2] 

    function callback(obj) { 
     var arr = arr || [] 
     console.log(arr) 
     $.each(vals, function(key, val) { 
      if (val == obj.a) { 
       arr.push(obj) 
      } 
     }) 
    } 

    var result = objs.find(callback); 

    console.log(">>>", result) 

예상 결과는 다음과 같습니다

는이 같은 filterfind 기능을 시도했다.

나는 두 개의 중첩 된 $.each()을 가지고 있습니다. 하나는 객체의 배열을 반복하고 두 번째는 속성 값의 배열을 반복하지만 마지막 옵션은 더 우아하고 짧은 것을 찾는 것입니다. 너희들은 어떤 생각을 가지고 있니?

답변

0

너는 filterindexOf으로 할 수 있습니다.

var objs = [{ a:1, }, {a:2}, {a:3}, {a:4}] 
 
var vals = [1, 2] 
 

 

 
function filterByValue(source, allowedValues) { 
 
    // Return the result of the filter. 
 
    return source.filter(item => { 
 
    // Returns true when `a` is present in vals (index > -1); otherwise it returns false. 
 
    return allowedValues.indexOf(item.a) > -1; 
 
    }); 
 
} 
 

 
const 
 
    filteredArray = filterByValue(objs, vals); 
 

 
console.log(filteredArray)

+0

@DZack 페어 점을, 솔루션을 찾고. – Thijs

0

티스의 대답은 작동 하지만 vals 배열이 많은수록 unperformant 얻을 것이다. O (n)의 복잡도를 얻으려면, 당신은 allowedValues 배열에서 세트를 만들 수 :

var objs = [{ a:1, }, {a:2}, {a:3}, {a:4}] 
 
var vals = [1, 2] 
 

 
function filterByValue(source, allowedValues) { 
 

 
    allowedValues = new Set(allowedValues) 
 
    // Return the result of the filter. 
 

 
    return source.filter(item => { 
 
    // Returns true when `a` is present in vals, otherwise it returns false. 
 
     return allowedValues.has(item.a); 
 
    }); 
 
} 
 
const filteredArray = filterByValue(objs, vals); 
 

 
console.log(filteredArray)

+0

@Kalreg이 질문에 대한 답변이 있으면 대답으로 표시 할 수 있습니까? – DZack