programing

유형 스크립트에서 값으로 지도를 "필터링"할 수 있습니까?

mytipbox 2023. 6. 27. 23:22
반응형

유형 스크립트에서 값으로 지도를 "필터링"할 수 있습니까?

저는 키 대신 값으로 지도를 필터링하는 방법을 찾고 있습니다.Angular 애플리케이션에 다음과 같이 모델링된 데이터 세트가 있습니다.

{
  "85d55e6b-f4bf-47bb-a988-78fdb9650ef0": {
    is_deleted: false,
    public_email: "007@example.org",
    id: "85d55e6b-f4bf-47bb-a988-78fdb9650ef0",
    modified_at: "2017-09-26T15:35:06.853492Z",
    social_url: "https://facebook.com/jamesbond007",
    event_id: "213b01de-da9e-4d19-8e9c-c0dae63e019c",
    visitor_id: "c3c232ff-1381-4776-a7f2-46c177ecde1c",
  },
}

이 항목의 키는 다음과 같습니다.id필드를 선택합니다.

이 항목들 중 몇 개를 고려할 때, 저는 필터링하고 반환하고 싶습니다.new Map()지정된 항목만 포함합니다.event_id만약 이것이 배열이라면 저는 다음과 같이 할 것입니다.

function example(eventId: string): Event[] {
  return array.filter((item: Event) => item.event_id === eventId);
}

기본적으로, 저는 다음의 기능을 복제하려고 시도하고 있습니다.Array.prototype.map()배열 대신 맵에서만 사용할 수 있습니다.

Lodash가 제 프로젝트에서 이미 사용 가능하기 때문에 보다 간결한 방법으로 이를 달성하는 데 도움이 된다면 기꺼이 사용하겠습니다.

그렇다.

Array.from(map.values()).filter((item: Event) => item.event_id === eventId);

또는 TypeScript 옵션의 경우,

[...map.values()].filter((item: Event) => item.event_id === eventId);

다음은 키와 값을 함께 보관하는 간단한 구문입니다.

const dict = new Map([["Z", 1324], ["A", 1], ["B", 2], ["C", 3], ["D", -12345]])

const filtered = [...dict.entries()].filter( it => it[1] < 10 ) 

// >  [ [ 'A', 1 ], [ 'B', 2 ], [ 'C', 3 ], [ 'D', -12345 ] ] 
export class MapUtils {
  static filter<TKey, TValue>(map: Map<TKey, TValue>, filterFunction: (key: TKey, value: TValue) => boolean): Map<TKey, TValue> {
    const filteredMap: Map<TKey, TValue> = new Map<TKey, TValue>();
    
    map.forEach((value, key) => {
      if (filterFunction(key, value)) {
        filteredMap.set(key, value);
      }
    });
    
    return filteredMap;
  }
}

용도:

 const filteredMap = MapUtils.filter(map, (key, value) => value > 0)

이것은 사용합니다.Object.entries지도를 배열로 변환합니다.Object.fromEntries지도로 다시 변환합니다.

let qs = {a:'A 1',b:null,c:'C 3'};
let qsfiltered = Object.fromEntries(
    Object.entries(qs).filter(([k,v]) => v !== null)
);

console.log(JSON.stringify(qsfiltered));

먼저 지도를 평평하게 만든 다음 내용을 추출해야 합니다.Events물건

let dataSet = {
     "entry1" : {  id: "85d55e6b-f4bf-47b0" },
     "entry2" : {  visitor_id: "6665b-7555bf-978b0" } 
}

 let flattenedMap = {};
    Object.entries(dataSet).forEach(
           ([key,value]) => Object.assign(flattenedMap, value)
     );
  

console.log("The flattened Map")
console.log(flattenedMap)

let events = [];
Object.entries(flattenedMap).forEach(
    ([key, value]) => events.push({"event_id" : value})
);

console.log("The events");
console.log(events);

언급URL : https://stackoverflow.com/questions/46605403/is-it-possible-to-filter-a-map-by-value-in-typescript

반응형