2017-11-07 3 views
-4

개체 배열 (데이터)이 있으며 각 기준에 여러 값을 가질 수있는 필터 기준 (기준)을 기준으로이 배열을 필터링해야합니다.n 필터 기준을 사용하여 객체 배열을 동적으로 필터링

var data = [ 
    { ID: 1, Name: "John", Color: "Blue", Location: "Up" }, 
    { ID: 2, Name: "Pauline", Color: "Green", Location: "Up" }, 
    { ID: 3, Name: "Ahmed", Color: "Orange", Location: "Left" }, 
    { ID: 4, Name: "Diego", Color: "Pink", Location: "Up" }, 
    { ID: 5, Name: "Maria", Color: "Black", Location: "Down" }, 
    { ID: 6, Name: "Gus", Color: "Green", Location: "Up" }, 
    { ID: 7, Name: "Brian", Color: "Pink", Location: "Left" }, 
    { ID: 8, Name: "Shelley", Color: "Green", Location: "Right" }, 
    { ID: 9, Name: "Leonardo", Color: "Blue", Location: "Right" }, 
    { ID: 10, Name: "Big Daddy", Color: "Green", Location: "Down" } 
]; 

var criteria = [ 
    { Field: "Color", Values: ["Green"] }, 
    { Field: "Location", Values: ["Up", "Down"] } 
]; 

제가 1. 각 필터 기준으로서 취급되는 "AND"필터 분야 2. 다중 필터 값이 "OR"로 간주되는 방식으로 물체 (필터링) 배열을 필요로한다. 그래서이 출력해야하는 방법이다 : 당신이 Array.every 및 조건에 대한 array.indexOf OR 조건을 사용할 수 있습니다

var filtered = [ 
     { ID: 2, Name: "Pauline", Color: "Green", Location: "Up" }, 
     { ID: 6, Name: "Gus", Color: "Green", Location: "Up" }, 
     { ID: 10, Name: "Big Daddy", Color: "Green", Location: "Down" } 
    ]; 
+2

에 StackOverflow에 –

+0

에 오신 것을 환영합니다 [질문]! 지금까지 시도한 적이 있습니까? StackOverflow는 무료 코드 작성 서비스는 아니며 [먼저 자신의 문제를 해결하려고합니다.] (http://meta.stackoverflow.com/questions/261592)를 기대합니다. [최소한의 완전하고 검증 가능한 예] (http://stackoverflow.com/help/mcve)에서 직면 한 특정 문제를 보여주기 위해 이미 시도한 것을 보여주기 위해 질문을 업데이트하십시오. 자세한 내용은 [좋은 질문을하는 방법] (0120) 번, [사이트 둘러보기] (http : //www.astackoverflow.com/help/how-to-ask) 을 참조하십시오. –

답변

2

.

참고 : indexOf은 대소 문자를 구분합니다. 당신이 대소 문자를 구분하게하려는 경우, 당신은 소문자로 두 값을 변환하고

var data = [ 
 
    { ID: 1, Name: "John", Color: "Blue", Location: "Up" }, 
 
    { ID: 2, Name: "Pauline", Color: "Green", Location: "Up" }, 
 
    { ID: 3, Name: "Ahmed", Color: "Orange", Location: "Left" }, 
 
    { ID: 4, Name: "Diego", Color: "Pink", Location: "Up" }, 
 
    { ID: 5, Name: "Maria", Color: "Black", Location: "Down" }, 
 
    { ID: 6, Name: "Gus", Color: "Green", Location: "Up" }, 
 
    { ID: 7, Name: "Brian", Color: "Pink", Location: "Left" }, 
 
    { ID: 8, Name: "Shelley", Color: "Green", Location: "Right" }, 
 
    { ID: 9, Name: "Leonardo", Color: "Blue", Location: "Right" }, 
 
    { ID: 10, Name: "Big Daddy", Color: "Green", Location: "Down" }, 
 
    { ID: 11, Name: "Dummy", Color: ["Green", "Orange"], Location: "Down" } 
 
]; 
 

 
var criteria = [ 
 
    { Field: "Color", Values: ["Green"] }, 
 
    { Field: "Location", Values: ["Up", "Down"] } 
 
]; 
 

 
var result = data.filter(function(obj){ 
 
    return criteria.every(function(c){ 
 
    var value = obj[c.Field]; 
 
    if(typeof value === 'object') { 
 
     return Object.keys(value).some(function(key){ 
 
     return c.Values.indexOf(value[key]) > -1 
 
     }) 
 
    } 
 
    else 
 
     return c.Values.indexOf(value) > -1 
 
    }) 
 
}) 
 
console.log(result)

+0

정확히 동일한 논리를 사용했지만 대신 음수를 사용했습니다. 당신은 더 우아한 대답을했습니다. – Prasanna

+0

네 대답을 보았다. 포인터 일 뿐이므로이 함수는 함수형 프로그래밍의 일부이며 코드를 쉽게 읽을 수 있도록 만들어졌습니다. '! '는 이해하는 데 시간이 걸릴 것입니다. 모든 기준이 충족되는 * 필터링 데이터 * 하나의 기준이 충족되지 않는 데이터 필터링 *. 둘 다 일을 할 것이지만 당신은 읽기 쉽고 관련이있는 것을 선택해야합니다. – Rajesh

+1

동의합니다! 그래서 당신의 대답이 제 것보다 더 우아합니다. – Prasanna

0

Array.some 어떤 경기 진정한 제공 비교하고 모든 불일치에 대해 false 수 있습니다. false를 예상하고이를 무효화하여 원본 데이터에 대한 필터 기준이 올바른지 확인합니다.

아주 좋은, 그러나 우리는 코드 작성 서비스가 아니며, 그래서 배울
filteredData = data.filter(d => 
    !(criteria.some(criterion => 
    criterion.Values.indexOf(d[criterion.Field]) === -1 
    )) 
) 
+1

또한 이미 ES6 기능을 사용하고 있으므로'array.includes'도 사용할 수 있습니다 – Rajesh