कोणीय 2 और टाइपस्क्रिप्ट के साथ दो ऑब्जेक्ट सरणियों को मर्ज करें?


91

मैं इस विषय पर जावास्क्रिप्ट सवालों के पार गया हूं, यह प्रश्न विशेष रूप से टाइपस्क्रिप्ट के साथ Angular2 के बारे में है।

मैं जो करने की कोशिश कर रहा हूं वह एक ऑब्जेक्ट के लिए जोंस ऑब्जेक्ट्स को समेटना है।

मेरा कोड कुछ इस तरह दिखता है,

public results: [];


public getResults(){
    this._service.get_search_results(this._slug, this._next).subscribe(
            data => {
                this.results.concat(data.results);
                this._next = data.next;
            },
            err => {
                console.log(err);
            }
        );
}

मैं कैसे जोड़ सकते हैं data.resultsकरने के लिएthis.results टाइपप्रति और कोणीय के साथ?

this._slug तथा this._next वर्ग पर सेट हैं।

धन्यवाद।

जवाबों:


121

मुझे लगता है कि आपको निम्नलिखित का उपयोग करना चाहिए:

data => {
  this.results = this.results.concat(data.results);
  this._next = data.next;
},

से concat दस्तावेज़ :

कॉन्कैट () पद्धति एक नई सरणी लौटाती है जिसमें सरणी शामिल होती है जिस पर इसे तर्कों के रूप में प्रदान की गई सरणी (एस) और / या मूल्य (ओं) के साथ जोड़ा जाता है।


1
दुर्भाग्य से, कि Uint8arrays के साथ काम नहीं करता है :(
फ्रेडरिक नॉर्ड

असफल हो सकता है अगर यह। अशक्त या अपरिभाषित है
माइकल फ्रीजिम

172

प्रसार ऑपरेटर थोड़े शांत है।

this.results = [ ...this.results, ...data.results];

प्रसार ऑपरेटर आपको किसी सरणी के विस्तारित संस्करण को आसानी से किसी अन्य सरणी में रखने की अनुमति देता है।

आप यहां प्रसार ऑपरेटर के बारे में पढ़ सकते हैं।


35

कोणीय 6 स्प्रेड ऑपरेटर और कॉनैट के साथ काम नहीं करता है। आप इसे आसानी से हल कर सकते हैं:

result.push(...data);

तरीकों के बीच वस्तु संदर्भ को बनाए रखते हुए एक समाधान की तलाश में यहां आए। यह पूरी तरह से काम किया। धन्यवाद
jgritten

यह सरणियों को मर्ज नहीं करता है, यह दूसरे से पहले में डेटा जोड़ता है। हालांकि यह काम कर सकता है, यह सावधान रहना है क्योंकि यह मूल सरणी को संशोधित करता है।
डावोर

5

आप ES6 द्वारा सुझाए गए फॉर्म का भी उपयोग कर सकते हैं:

data => {
  this.results = [
    ...this.results,
    data.results,
  ];
  this._next = data.next;
},

यह काम करता है यदि आप पहले अपने सरणी को शुरू करते हैं ( public results = [];); अन्यथा ...this.results,द्वारा प्रतिस्थापित करें ...this.results ? this.results : [],

उम्मीद है की यह मदद करेगा



0

मान लें कि मेरे पास दो एरेज़ हैं। पहले एक में छात्र का विवरण है और छात्र के विवरण को चिह्नित करता है। दोनों सरणियों में सामान्य कुंजी है, जो कि 'studentId' है

let studentDetails = [
  { studentId: 1, studentName: 'Sathish', gender: 'Male', age: 15 },
  { studentId: 2, studentName: 'kumar', gender: 'Male', age: 16 },
  { studentId: 3, studentName: 'Roja', gender: 'Female', age: 15 },
  {studentId: 4, studentName: 'Nayanthara', gender: 'Female', age: 16},
];

let studentMark = [
  { studentId: 1, mark1: 80, mark2: 90, mark3: 100 },
  { studentId: 2, mark1: 80, mark2: 90, mark3: 100 },
  { studentId: 3, mark1: 80, mark2: 90, mark3: 100 },
  { studentId: 4, mark1: 80, mark2: 90, mark3: 100 },
];

मैं कुंजी 'studentId' के आधार पर दो सरणियों का विलय करना चाहता हूं। मैंने दो सरणियों को मर्ज करने के लिए एक फ़ंक्शन बनाया है।

const mergeById = (array1, array2) =>
    array1.map(itm => ({
      ...array2.find((item) => (item.studentId === itm.studentId) && item),
      ...itm
    }));

यहाँ अंतिम परिणाम प्राप्त करने के लिए कोड है

let result = mergeById(studentDetails, studentMark);

[
{"studentId":1,"mark1":80,"mark2":90,"mark3":100,"studentName":"Sathish","gender":"Male","age":15},{"studentId":2,"mark1":80,"mark2":90,"mark3":100,"studentName":"kumar","gender":"Male","age":16},{"studentId":3,"mark1":80,"mark2":90,"mark3":100,"studentName":"Roja","gender":"Female","age":15},{"studentId":4,"mark1":80,"mark2":90,"mark3":100,"studentName":"Nayanthara","gender":"Female","age":16}
]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.