2016-10-14 3 views
0

개체가있는 배열이 있습니다. 짧게적어도 하나의 일치하는 속성이있는 컬렉션의 모든 개체 찾기

Array =[ 
    {id = 1, products='1,2'} //products consist of String with Products Seperates by',' 
    {id = 2, products='1'} 
    {id = 3, products='3'} 
    {id = 4, products='1,2,3'} 
    {id = 5, products='2,3'} 
    ... 
    ] 
SelectedProd = ['2,3']// consists a String as well seperated by ',' 

이것은 모두 표에 표시됩니다. 이제 MultipleSelect를 통해 선택한 필터 만 표시하는 필터를 작성합니다. 적어도 하나 개의 제품 products
그래서 내 필터 받고있는 개체 및 선택한 제품

.filter('filterByProd',() => { 
      return (objects,prod) => { 
      var filtered = []; 
      /* 
FIlter Array 
*/ 
      return filtered; 
      }; 
     }); 

에 여기서 사용자가 Product = '2,3'id=1/3/4/5..와 나에게 개체를 반환해야 선택하면
그러므로 나는 모든 개체를 필터링 할
분명히 아무것도 선택하지 않은 경우 모두를 반환합니다. 가능한 경우 lodash를 사용하지만 다른 해결책도 허용됩니다.
문제는 lodash Docu에 나열된 기능 뿐이며 필요한 모든 사람을 읽지 않습니다. 단지>Object = id=5 - 순간 스피에서
이것은 '2,3' 만 정확히 일치 날을주고있다

.filter('filterByProd',() => { 
    return (items,prod) => { 
    var filtered = []; 
    filtered = _.filter(items,['products',prod]); 
    return filtered; 
    }; 
}); 

에 붙어. 서버에서이 객체를 일단
나는, 어느 배열 형식으로 CSV의를 포함하는 새로운 배열 속성을 주입 또는 배열을 완전히 제품을 대체하여 수정 뭔가

filtered = findAllWhere(selectedProducts,iterateOverSendObjects(checkProductsOfObjects)+_.ifIsAtLeastOneOfSendProducts)) 
+0

배열에 문제가있을 때 '2,3'과 같은 제품에 대한 문자열이있는 이유는 무엇입니까? '[2,3]'?그리고 그것들을 통한 반복의 간단한 문제가 될 것입니다. – taguenizy

+0

내 서버에서 이것을 얻고 있습니다. – AkAk47

+0

어느 쪽이든 그것을 파싱해야합니다. 데이터를 얻거나 필터링하려고 할 때 바로 할 수 있습니다 – taguenizy

답변

1

당신이 원하는 결과를 얻기 위해 lodash의 교차 방법을 사용할 수 있습니다.

var a = arr.filter(x => { 
    return _.intersection(
      x.products.split(','), SelectedProd[0].split(',') 
      ).length > 0; 

여기에 작업 인라인 바이올린의 :

var arr = [ 
 
    {id : 1, products:'1,2'}, 
 
    {id : 2, products:'1'}, 
 
    {id: 3, products:'3'}, 
 
    {id : 4, products:'1,2,3'}, 
 
    {id : 5, products:'2,3'}]; 
 

 
var SelectedProd = ['2,3']; 
 

 
var a = arr.filter(x => { 
 
    return _.intersection(
 
      x.products.split(','), SelectedProd[0].split(',')).length>0; 
 
}); 
 

 
console.log(a);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.js"></script>

설명 : 두 배열의

Lodash _.intersection 반환 교차로는 [] 반환 다른 존재, 또는 경우. 필터를 사용하여 교차가 비어 있지 않은 객체 만 필터링합니다.

+0

귀하의 솔루션을 실행하는 임 thx. 아무 것도 선택되지 않으면 질문이 하나 더 있습니다. var a = arr.filter (....)와 같은 것이 있습니다. if (selected === null) return arr; 지금은 필터링 전의 경우와 같이 간단한 것으로 확인하고 있습니다. 그런 것을 첨부 할 수 있는지 알고 싶습니까? :) – AkAk47

0

이 필요합니다. 최종 배열 바인딩하기 전에 다음과 같이해야한다 : 답변으로 표시하십시오

[
{id = 1, products=[1,2]}, {id = 2, products=[1]} ... ]

이 당신이 선택한 항목에서 검색 Array.prototype.some()Array.prototype.filter()String.prototype.includes()를 사용하여 항목을 필터링 할 수 있습니다

+0

해결책을 수정하지 않고 있습니까? 왜냐하면 나는이 필터보다 더 많은 기능을 사용하기 때문입니다. 그리고 여전히 해결책이 아닙니다. 어떻게 내가 원하는대로 객체를 필터링 할 수 있습니까? – AkAk47

+0

모든 서버 응답 개체가 비슷한 경우 Response Objecct 변환을 처리하는 간단한 Mapper 모듈을 쉽게 만들 수 있습니다. 필터링에 관한 질문 : foreach 루프 내에서 indexOf JS 작업을 사용하면 객체 배열을 반복 할 수 있습니다. indexOf 연산이 선택된 각 제품에 대해 -1이 아닌 값을 반환하면 최종 결과 집합에 추가 할 수 있습니다. 이것은 트릭을해야합니다. –

+0

아니요 대부분 모두 다 다릅니다. 이것은 그것이 필요하기 때문에 이렇게오고 있습니다. 하지만 수정하는 방법을 설명하면 필자 만 필터에서 할 수 있습니다. 그리고 거기에 필터링을하십시오 – AkAk47

0

을 도움이된다면 문자열 :

const findIemsByProducts = (items, selectedProd) => { 
 
    const selected = selectedProd[0].split(','); // convert the selected products to array 
 
    
 
    return items.filter((item) => // filter the items 
 
    selected.some((productId) => // if at least one of the selected 
 
     item.products.includes(productId) // is in the products string 
 
    )); 
 
} 
 

 
var items = [ 
 
    {id: 1, products: '1,2'}, 
 
    {id: 2, products: '1'}, 
 
    {id: 3, products: '3'}, 
 
    {id: 4, products: '1,2,3'}, 
 
    {id: 5, products: '2,3'} 
 
]; 
 

 
var SelectedProd = ['2,3']; 
 

 
var results = findIemsByProducts(items, SelectedProd); 
 

 
console.log(results);

그리고 각 필터는 것은 :

.filter('filterByProd',() => (items, selectedProd) => { 
    const selected = selectedProd[0].split(','); // convert the selected products to array 

    return items.filter((item) => // filter the items 
    selected.some((productId) => // if at least one of the selected 
     item.products.includes(productId) // is in the products string 
    )); 
});