কীভাবে কোনও ডিওএম অবজেক্টে সম্পত্তি সেট করার সময় নো-প্যারাম-পুনরায় নিয়োগ এড়ানো যায়


97

আমার একটি পদ্ধতি রয়েছে যার মূল উদ্দেশ্য একটি ডিওএম অবজেক্টে একটি সম্পত্তি সেট করা

function (el) {
  el.expando = {};
}

আমি এয়ারবিএনবির কোড স্টাইল ব্যবহার করি যা ইএসলিন্টকে ত্রুটিযুক্ত করে তোলে no-param-reassign:

ত্রুটি বরাদ্দকরণ প্যারামিটার 'এল' নো-প্যারাম-রিসাইন করার জন্য

এয়ারবিএনবির কোড স্টাইলটি মেনে চলার সময় আমি কীভাবে ডিওএম অবজেক্টকে আর্গুমেন্ট হিসাবে পাস করব?

কেউ অন্য সমস্যার/* eslint react/prop-types: 0 */ উল্লেখ করে ব্যবহার করার পরামর্শ দিয়েছিল তবে আমার যদি ভুল না হয় তবে এটি প্রতিক্রিয়ার জন্য ভাল, তবে নেটিভ ডোম হেরফেরের জন্য নয়।

এছাড়াও আমি মনে করি না কোড স্টাইল পরিবর্তন করা একটি উত্তর। আমি বিশ্বাস করি যে একটি স্ট্যান্ডার্ড স্টাইল ব্যবহারের অন্যতম সুবিধা হল প্রকল্পগুলির নিয়মিত কোড থাকা এবং এ সংক্রান্ত নিয়মগুলি পরিবর্তন করা এয়ারবিএনবির মতো কোনও প্রধান কোড শৈলীর অপব্যবহারের মতো অনুভূত হয়।

রেকর্ডটির জন্য, আমি গিটহাবের এয়ারবিএনবিকে জিজ্ঞাসা করলাম, # 766 ইস্যুতে তারা এই ক্ষেত্রে কীভাবে যাওয়ার উপায় বলে মনে করে ?


নাহ। প্রথমত, এর অর্থ হ'ল অন্যান্য নিয়মগুলির জন্য এটি অক্ষম করা যেখানে এই নিয়মটি বোঝায়। দ্বিতীয়ত আমি বিশ্বাস করি আপনি হয় কোনও স্টাইল গাইড অনুসরণ করেন বা না করেন। কমপক্ষে যদি এটি কোনও স্টাইল গাইড হয় যারপরে সমস্ত বিকাশকারী অনেক প্রকল্পে অনেক বিকাশকারী by
লুকাস

4
তবে আপনি কীভাবে স্টাইলগাইড মানবেন না তা জিজ্ঞাসা করছেন, কারণ আপনি যে কাজটি প্রতিরোধের জন্য চেষ্টা করছেন সেটি আপনি করছেন। যাই হোক না কেন, কেবলমাত্র সেই ফাংশনটির জন্য
ম্যাথলেটিক্স


@ ম্যাথলেটিক্স না, আমি নিয়মটিকে সংবেদনশীল মনে করি না, তবে এটি কেবল এই নির্দিষ্ট ক্ষেত্রে কার্যকর হয় না। আমি ভাবছিলাম নিয়মগুলি সহ এইভাবে খেলার কোনও উপায় আছে কিনা।
লুকাশ

আপনি এটি যেভাবেই কথাই বলুন না কেন, অপারেশনটি আপনি নিয়মের সাথে দ্বন্দ্ব চান। বলেছিল, এটি একটি এক্সওয়াই সমস্যার মতো মনে হচ্ছে; আমি এর মতো সরাসরি ডোম নোডের সাথে সম্পত্তি যুক্ত করব না।
ম্যাথলেটিক্স

উত্তর:


102

@ ম্যাথলেটিক্সের পরামর্শ অনুসারে, আপনি আপনার ফাইলে এটি যুক্ত করে পুরোপুরি বিধি নিষ্ক্রিয় করতে পারেন .eslintrc.json:

"rules": {
  "no-param-reassign": 0
}

অথবা আপনি বিশেষত প্যারাম বৈশিষ্ট্যের জন্য নিয়মটি অক্ষম করতে পারেন

"rules": {
  "no-param-reassign": [2, { "props": false }]
}

বিকল্পভাবে, আপনি এই ফাংশনটির জন্য নিয়মটি অক্ষম করতে পারেন

/* eslint-disable no-param-reassign */
function (el) {
  el.expando = {};
}
/* eslint-enable no-param-reassign */

বা কেবল সেই লাইনের জন্য

function (el) {
  el.expando = {}; // eslint-disable-line no-param-reassign
}

আপনি এই ব্লগ পোস্টটি বিশেষত এয়ারবিএনবির স্টাইল গাইডকে সামঞ্জস্য করার জন্য ESLint বিধি নিষ্ক্রিয় করার বিষয়েও দেখতে পারেন।


4
ধন্যবাদ. দেখে মনে হচ্ছে বেশিরভাগ লোকেরা সবচেয়ে ভাল উপায় লিন্টারে পরিবর্তন করে find একক লাইনের জন্য এটি প্রয়োগ করা এখনই আমার পক্ষে সেরা বাণিজ্য বলে মনে হচ্ছে।
লুকাশ

4
এটি নোডেজ এক্সপ্রেস প্রকল্পগুলির জন্য সত্যই অর্থবোধ করে, যেখানে কখনও কখনও আপনি res.sessionসরাসরি সরাসরি পরিবর্তন করতে চান
ডেভিড

যদি প্রশ্নটিতে বর্ণিত ফাংশন প্যারামিটারগুলির বৈশিষ্ট্য নির্ধারণের ক্ষেত্রে সমস্যাটি থাকে তবে নীচে জ্ঞানদীপের উত্তরটি আরও ভাল।
প্রশান্ত চন্দ্র

88

যেমন এই নিবন্ধটি ব্যাখ্যা করেছে , এই বিধিটি পরিবর্তনকে এড়াতে বোঝানো হয়েছেarguments বস্তুর । আপনি যদি কোনও প্যারামিটারে বরাদ্দ করেন এবং তারপরে argumentsঅবজেক্টের মাধ্যমে কিছু পরামিতিগুলি ব্যবহার করে দেখার চেষ্টা করেন তবে এটি অপ্রত্যাশিত ফলাফলের দিকে নিয়ে যেতে পারে।

আপনি নিয়মটি অক্ষুণ্ন রাখতে এবং ডিওএম উপাদানটির রেফারেন্স পেতে অন্য পরিবর্তনশীলটি ব্যবহার করে এয়ারবিএনবি স্টাইলটি বজায় রাখতে পারেন এবং তারপরে এটি সংশোধন করতে পারেন:

function (el) {
  var theElement = el;
  theElement.expando = {};
}

জেএস বস্তুগুলিতে (ডিওএম নোড সহ) রেফারেন্স দ্বারা পাস করা হয়, সুতরাং এখানে elএবং theElementএকই ডিওএম নোডের রেফারেন্স রয়েছে, তবে পরিবর্তনটি সেই ডিওএম এলিমেন্টের কেবল একটি রেফারেন্স হিসাবে অবধি পরিবর্তন theElementকরে না argumentsobjectarguments[0]

এই পদ্ধতির নিয়মের ডকুমেন্টেশনে ইঙ্গিত দেওয়া হয়েছে :

এই নিয়মের জন্য সঠিক কোডের উদাহরণ:

/*eslint no-param-reassign: "error"*/

function foo(bar) {
    var baz = bar;
}

ব্যক্তিগতভাবে, আমি কেবলমাত্র "no-param-reassign": ["error", { "props": false }]বর্ণিত অন্যান্য উত্তরগুলির দু'টি ব্যবহার করব। প্যারামিটারের কোনও বৈশিষ্ট্য পরিবর্তন করা সেই প্যারামিটারটিকে যা রূপান্তরিত করে তা রূপান্তরিত করে না এবং এই নিয়মটি এড়াতে চাইছে এমন ধরণের সমস্যাগুলির মধ্যে চালিত হওয়া উচিত নয়।


6
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, আচরণকে বাধা দেওয়ার কোনও উপায় নয়। যেহেতু এই উত্তরটি এবং প্যাট্রিক বেকন যেমন অফিসিয়াল ইএসলিন্ট ডকুমেন্টেশনে বর্ণিত হয়েছে একটি স্পষ্ট সমস্যা চিহ্নিত করেছে যা এটির সাথে কিছু পরিস্থিতিতে ঘটতে পারে: স্পিন.টমিকোবজেক্ট.কম
রেমি

4
এই উত্তরটি গ্রহণযোগ্য উত্তর হওয়া উচিত কারণ এটি সরকারী ডকুমেন্টেশনের দিকে ইশারা করে এবং ভালভাবে ব্যাখ্যা করা হয়। অন্যান্য উত্তরগুলির বেশিরভাগই আগুনের এলার্ম বন্ধ করার মতো!
হামিদ পারচমি

আপনি "লোকাল ভেরিয়েবল 'দ্য এলিমেন্টটি রিডানড্যান্ট" পেতে পারেন।
Phấm Tuấn Anh

এই নতুন রেফারেন্সগুলির জন্য আপনি কী ধরণের নামকরণের স্কিম ব্যবহার করবেন? আমি এখানে জিনিসের সামনে 'মাই' রাখার বিষয়টি একেবারেই ঘৃণা করি তবে নতুন রেফারেন্স তৈরি করার সময় ইতিমধ্যে যথাযথভাবে নামকরণ করা প্যারামিটারগুলির নামকরণ করা সত্যই শক্ত এবং এমনকি পাল্টা স্বজ্ঞাত।
ঘোস্টবাইটস

আমি স্রেফ পরীক্ষা করে দেখেছি এবং arguments[0]পরিবর্তিত হয়েছি । আমি কি ভুল করছি? ... theElement.expando = { p: 2 }; return arguments[0].expando; ...
শ্রীমৌজি

20

আপনি নিজের .eslintrcফাইলের ভিতরে এই নিয়মটিকে ওভাররাইড করতে পারেন এবং এটির মতো পরম বৈশিষ্ট্যের জন্য এটি অক্ষম করতে পারেন

{
    "rules": {
        "no-param-reassign": [2, { 
            "props": false
        }]
    },
    "extends": "eslint-config-airbnb"
}

এইভাবে নিয়মটি এখনও সক্রিয় তবে এটি বৈশিষ্ট্যের জন্য সতর্ক করবে না। আরও তথ্য: http://eslint.org/docs/rules/no-param-reassign


4
এই উত্তরটি কি পুরোপুরি গৃহীত কোনওটির মধ্যে অন্তর্ভুক্ত নয়?
ড্যান ড্যাসক্লেস্কু

4
@ ড্যানডাসকলেস্কু গৃহীত উত্তরের নীচে একটি মন্তব্য রয়েছে যা এই উত্তরটির দিকে নির্দেশ করছে, তাই সম্ভবত এটি আরও ব্যাপক আকারে সম্পাদিত হয়েছিল?
বিগসি

12

no-param-reassignসাবধানবাণী সাধারণ কাজকর্মের জন্য জ্ঞান করে তোলে, কিন্তু একটি ক্লাসিক জন্যArray.forEach একটি অ্যারের যা আপনি এটা পরিবর্তন ঘটান মনস্থ উপর লুপ যথাযথ নয়।

যাইহোক, এটি পেতে, আপনি Array.mapএকটি নতুন অবজেক্টের সাথেও ব্যবহার করতে পারেন (যদি আপনি আমার মতো হন তবে মন্তব্য সহ স্নোজিং সতর্কতাগুলি অপছন্দ করুন):

someArray = someArray.map((_item) => {
    let item = Object.assign({}, _item); // decouple instance
    item.foo = "bar"; // assign a property
    return item; // replace original with new instance
});

4
function (el) {
  el.setAttribute('expando', {});
}

অন্য সব কিছুই কেবল কুরুচিপূর্ণ হ্যাকস।


2

বেছে বেছে এই নিয়ম নিষ্ক্রিয় তবেই ঐ একটি আগ্রহী হতে পারে প্রস্তাবিত নতুন বিকল্প জন্য no-param-reassignনিয়ম যে সম্মান যা পরামিতি অতীতকে ফিরিয়ে উপেক্ষা করা উচিত সঙ্গে বস্তুর নামের একটি "সাদা তালিকা" সম্ভব হবে।


উপরে মন্তব্যগুলির পরিবর্তে উত্তর হিসাবে পোস্ট করা হয়েছিল, রেপ পয়েন্টের অভাবের কারণে।
এইচ বেকার



0

আপনি ডেটা আপডেট করার জন্য পদ্ধতিগুলি ব্যবহার করতে পারেন। যেমন "res.statusCode = 404" এর পরিবর্তে "res.status (404)" আমি সমাধানটি পেয়েছি। https://github.com/eslint/eslint/issues/6505#issuecomment-282325903

/*eslint no-param-reassign: ["error", { "props": true, "ignorePropertyModificationsFor": ["$scope"] }]*/

app.controller('MyCtrl', function($scope) {
  $scope.something = true;
});

-1

তুমি ব্যবহার করতে পার:

(param) => {
  const data = Object.assign({}, param);
  data.element = 'some value';
}

4
এটি কি কেবল অনুলিপিটি সংশোধন করে না (কীভাবে এটি মূল্যবান)?
2540625

4
এটি আসলে কোনও সমাধান নয় কারণ এর অর্থ একটি নতুন অবজেক্ট তৈরি করে প্যারাম পুনরায় সাইন ইন করা এড়ানো উচিত যখন আমার স্পষ্টতই একটি নতুন অবজেক্ট তৈরি করার দরকার নেই তবে মূলটি সংশোধন করা দরকার।
Lukas

আমি প্যারামগুলি সংশোধন না করা পছন্দ করি, তবে আপনি যদি অবজেক্ট.ডেফাইনপ্রোপার্টি () ব্যবহার করতে পারেন তবে যদি এইভাবে লিটারারটি আপনাকে ত্রুটি না ফেলে।
অলিভার

এটি কিছুতেই কাজ করবে না। আপনি ভেরিয়েবলের একটি অনুলিপি তৈরি করছেন, এটিকে থেকে কোনও নতুন বস্তুতে বৈশিষ্ট্যগুলি অনুলিপি করছেন, কোনও সম্পত্তি পরিবর্তন করছেন এবং তারপরে এটি ফিরিয়ে দিচ্ছেন না, তাই কিছুই হয় না। এমনকি যদি আপনি এটি ফিরিয়ে দেন, আপনি কোনও বস্তুটি ফিরিয়ে দিচ্ছেন, কোনও ডিওএম উপাদান যেমন পাস করা হয়েছিল তার মতো নয় that তার উপরে, Object.assignকোনও লক্ষ্য থেকে কোনও বস্তুতে অনুলিপি করার জন্য। কোনও ডিওএম উপাদান থেকে অনুলিপি দেওয়ার চেষ্টা করা হচ্ছে এর ফলে একটি খালি অবজেক্ট হয়।
অকেজো কোড

প্লাস Object.assignযথাযথভাবে কাজ করবে না যদি আপনি বিজ্ঞপ্তি রেফারেন্স (উদাহরণস্বরূপ একটি সকেট সংযোগ) সহ অবজেক্টে কোনও সম্পত্তি পুনরায় আশ্বস্ত করার চেষ্টা করছেন। Object.assignডিফল্টরূপে একটি অগভীর অনুলিপি, এবং ডিফ ক্লোনিংটি পারফরম্যান্সের হিটের কারণে খুব নীচু হয়।
ILikeTacos

-1

আপনি যদি কোনও অবজেক্ট অ্যারের অভ্যন্তরে কোনও মান পরিবর্তন করতে চান তবে আপনি ব্যবহার করতে পারেন

array.forEach(a => ({ ...a, expando: {} }))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.