ये इनपुट अवलोकन योग्य हैं:

items$ = of([
  {name: 'John', age: 30, job: 'Dentist', address: {street: 'Maple (6,103)', country: 'US'},
  {name: 'Mark', age: 34, job: 'Driver', address: {street: 'Pine (6,170)', country: 'US'}},
  {name: 'Johannes', age: 25, job: 'Mechanic', address: {street: 'Elm (5,233)', country: 'US'}},
  {name: 'Thjoma', age: 28, job: 'Coder', address: {street: 'Lake (4,901)', country: 'US'}},
])

fields$ = of([
  name, age, street
])

प्रत्येक आइटम के लिए उपरोक्त अवलोकन फ़ील्ड को एक नई वस्तु पर कैसे मैप करें और नई सरणी वापस करें?

अपेक्षित परिणाम:

of([
  {name: 'John', age: 30, job: 'Dentist', street: 'Maple (6,103)'},
  {name: 'Mark', age: 34, job: 'Driver', street: 'Pine (6,170)'},
  {name: 'Johannes', age: 25, job: 'Mechanic', street: 'Elm (5,233)'},
  {name: 'Thjoma', age: 28, job: 'Coder', street: 'Lake (4,901)'},
])

प्रत्येक आइटम के लिए नई वस्तु प्राप्त करने के लिए अंदर की वस्तुओं (सड़क) को मैप/चपटा देखें।

मैंने कुछ इस तरह की कोशिश की है: लेकिन यह काम नहीं कर रहा है।

    return combineLatest(
      this.items$,
      this.fields$,
      (items, fields) => ({ items, fields })
    ).pipe(
      map(({ items, fields }) =>
        fields.reduce(
          (acc, cur) => ({ ...acc, [cur]: items.map((item) => item[cur]) }),
          {}
        )
      )
    );

क्या कोई मदद कर सकता है?

इसे देखें

केवल देखने योग्य फ़ील्ड $ से फ़ील्ड परिणामी नमूदार में दिखाई दे रहे हैं। दूसरों को छोड़ दिया जाता है।

1
mx_code 4 जून 2020, 23:24

1 उत्तर

सबसे बढ़िया उत्तर

कुछ इस तरह काम कर सकता है: StackBlitz

const $specifiedFieldsOnly = combineLatest(this.items$, this.fields$).pipe(
  map(([items, fields]) => 
    items.map(item => (
      fields.reduce((obj, field) => ({ ...obj, [field]:item[field] }), {}))
    )
  )
);

बेशक यह केवल उन फ़ील्ड नामों के लिए काम करेगा जो स्रोत डेटा में मौजूद हैं। आपके मामले में street काम नहीं करेगा क्योंकि आपके ऑब्जेक्ट में street प्रॉपर्टी नहीं है। आप address.street संपत्ति को खोदना चाहते हैं, इसलिए उस काम को करने के लिए आपको कुछ काम करना होगा।

अगर आप नेस्टेड प्रॉपर्टी (जैसे address.street) को दर्शाने के लिए डॉट के साथ अपने फ़ील्ड नाम निर्दिष्ट करना चाहते हैं, तो यह काम कर सकता है: StackBlitz

const fields$ = of([
  'name', 'age', 'address.street', 'address.country'
]);

const $specifiedFieldsOnly = combineLatest(this.items$, this.fields$).pipe(
  map(([items, fields]) => 
    items.map(item => (
      fields.reduce((obj, path) => {
        const field = path.split('.').reduce(
          (acc, cur, i) => { 
            const name = cur;
            const value = (i === 0) ? item[cur] : acc.value[cur];

            return { name, value };
          },
          { name: undefined, value: undefined }
        );

        return { ...obj, [field.name]: field.value };

      }, {}))
    )
  )
);

नोट: यदि आप डुप्लिकेट फ़ील्ड नामों के बारे में चिंतित हैं तो आपको थोड़ा और विस्तृत होने की आवश्यकता होगी।

0
BizzyBob 5 जून 2020, 07:07