मेरे पास कोड का यह उदाहरण है

let numbers = [1, 2, 3]
let summableNum = Object.assign({}, numbers, {
  sum: function() {
    return this.reduce(function(a, b) {
      return a + b
    })
  }
})

परिणाम है:

{
  "0": 1,
  "1": 2,
  "2": 3,
  sum: f
}

summableNum[0]  // 1

जब मैं summableNum.sum() निष्पादित करता हूं, तो मुझे यह त्रुटि होती है

ध्यान में न आया लेखन त्रुटि: this.reduce Object.sum (:4:17) पर :11:17 पर एक फ़ंक्शन नहीं है

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

summableNum.sum() // 6

क्या आप मेरी मदद कर सकते हैं

-1
Khaled Ayed -ngCode- 9 जुलाई 2019, 11:52

3 जवाब

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

आपका summableNum {} ऑब्जेक्ट है, जिसमें .reduce प्रॉपर्टी नहीं है। इसके बजाय एक सरणी का प्रयोग करें:

const numbers = [1, 2, 3];
const summableNum = Object.assign([], numbers, {
  sum() {
    return this.reduce((a, b) => a + b, 0);
  }
});

या सरणी की एक प्रति का उपयोग करें:

const numbers = [1, 2, 3];
const summableNum = Object.assign(Array.from(numbers), {
  sum() {
    return this.reduce((a, b) => a + b, 0);
  }
});
1
Bergi 9 जुलाई 2019, 11:59

अगर आप चाहते हैं कि nums में कोई विधि हो sum, तो मैं इसे प्रोटोटाइप से जोड़ने से बचूंगा... और Object.defineProperty इस कार्य के लिए Object.assign से अधिक उपयुक्त है।

const nums = [1, 2, 3];

Object.defineProperty(nums, 'sum', {
  value: () => nums.reduce((a, b) => a + b),
});

console.log('[1,2,3].sum() =', nums.sum())

हालांकि, जाने का सही तरीका (मेरी राय में), अधिक कार्यात्मक होना है ... यदि आप डेटा को उसके व्यवहार से अलग करते हैं, तो पुन: उपयोग कोड बहुत आसान हो जाता है:

const sum = nums => nums.reduce((a, b) => a + b);

console.log(sum([1, 2, 3]));

// but also sum([55,56,57]) and so on
0
Hitmands 9 जुलाई 2019, 13:21

या तो वास्तविक सरणी उदाहरण के लिए sum प्रॉपर्टी असाइन करें, या Array.prototype (आमतौर पर अनुशंसित नहीं है, क्योंकि यह एक अंतर्निहित प्रोटोटाइप को बदलता है - आमतौर पर उन वस्तुओं को म्यूट करने का अच्छा विचार नहीं है जो आपके पास नहीं हैं ):

const numbers = [1, 2, 3]

// Method 1:
const summableNum1 = [...numbers];
summableNum1.sum = function() {
  return this.reduce(function(a, b) {
    return a + b
  })
};

console.log(summableNum1.sum());

// Method 2:
Array.prototype.sum = function() {
  return this.reduce(function(a, b) {
    return a + b
  })
};
const summableNum2 = [...numbers];
console.log(summableNum2.sum());

एक अलग विकल्प एक ऐसा वर्ग बनाना है जो extends Array जिसमें sum विधि हो:

// Method 3
class SummableArray extends Array {
  sum() {
    return this.reduce((a, b) => a + b);
  }
}
const numbers = new SummableArray(1, 2, 3);
console.log(numbers.sum());
1
CertainPerformance 9 जुलाई 2019, 11:55