আমি কীভাবে কোনও জাভাস্ক্রিপ্ট অবজেক্ট থেকে কোনও সম্পত্তি সরিয়ে দেব?


6138

বলুন আমি নীচে একটি অবজেক্ট তৈরি করেছি:

let myObject = {
    "ircEvent": "PRIVMSG",
    "method": "newURI",
    "regex": "^http://.*"
};

regexনতুনভাবে শেষ করে সম্পত্তিটি সরিয়ে নেওয়ার সর্বোত্তম উপায় কী myObject?

let myObject = {
    "ircEvent": "PRIVMSG",
    "method": "newURI"
};


@ এস্কেপনেটস্কেপ এটি আচরণ সম্পর্কিত একটি প্রশ্ন, তাই একটি বেঞ্চমার্ক ভুল চিত্র আঁকা। অবশ্যই deleteএটি সবচেয়ে ধীর বিকল্প হবে যেহেতু এটি একটি আসল অপারেশন নয় বরং অন্য দুটি তুলনায় যা কেবল সহজ কাজ ments তবে বিষয়টির ক্রুশটি হ'ল সম্পত্তি অর্পণ করা nullবা undefinedবস্তু থেকে সম্পত্তিটি মুছে ফেলা হয় না বরং পরিবর্তে সেই সম্পত্তিটিকে একটি নির্দিষ্ট ধ্রুবক মানের সমান হিসাবে সেট করে। (নীচে উত্তরগুলি কেন এটি একটি তাত্পর্যপূর্ণ পার্থক্যের কারণ দেয়))
অ্যাবিয়ন 47

উত্তর:


8294

এটার মত:

delete myObject.regex;
// or,
delete myObject['regex'];
// or,
var prop = "regex";
delete myObject[prop];

ডেমো

var myObject = {
    "ircEvent": "PRIVMSG",
    "method": "newURI",
    "regex": "^http://.*"
};
delete myObject.regex;

console.log(myObject);

এটি সম্পর্কে আরও পড়তে আগ্রহী যে কোনও ব্যক্তির জন্য, স্ট্যাক ওভারফ্লো ব্যবহারকারী কঙ্গাক্সdelete তাদের ব্লগে বিবৃতিটি মুছে ফেলা বোঝার বিষয়ে একটি অবিশ্বাস্যভাবে গভীরভাবে ব্লগ পোস্ট লিখেছেন । এটি অত্যন্ত প্রস্তাবিত।


47
চেক করা হয়েছে, এটি "আমার জেএসএনওবজেক্ট ['রেজেক্স'] মুছুন; দেখুন: বিকাশকারী.মোজিলা.আর.ইন
কোর_জাভাস্ক্রিপ্ট_1.5_সূত্র /

109
উপরের "বোঝার মুছুন" লিঙ্কটিতে একটি পর্যবেক্ষণের একটি ফলস্বরূপ, যেহেতু আপনি প্রয়োজনীয়ভাবে কোনও ভেরিয়েবল মুছতে পারবেন না, তবে কেবলমাত্র বস্তুর বৈশিষ্ট্য, তাই আপনি "রেফারেন্স দ্বারা" কোনও বস্তুর সম্পত্তি মুছতে পারবেন না - var মান = اعتراض [ 'ঠেকনা']; মুছে ফেলুন মান // কাজ করে না
16-24

27
সুতরাং এটি আসলে এটি মুছে না? এটি কেবল অপরিজ্ঞাত হয়ে যায়, তবে কীটি এখনও বিদ্যমান? আমি কিছু অনুপস্থিত করছি?
ডগ মোলিনাক্স

151
@ পিট না, এটি এটি সরিয়ে দেয়। প্রদত্ত: var x = {a : 'A', b : 'B'};তুলনা করুন: delete x.a; typeof x.a; /* "undefined" */ x.hasOwnProperty('a'); /* false */থেকেx.b = undefined; typeof x.b; /* "undefined" */; x.hasOwnProperty('b'); /* true */
নিকফ

16
@ ক্রিসটফারপোহল আমার পক্ষে কাজ করে। যেমনটি আমি বলেছিলাম, এটি আসলে বেশ গভীরভাবে, তাই এটি সংক্ষেপে বলা একটু কঠিন difficult উপরের উত্তরের মূল প্রতিক্রিয়া প্রায় সকল ক্ষেত্রেই যথেষ্ট, ব্লগটি আরও কয়েকটি প্রান্তের কেসগুলিতে চলে যায় এবং কারণগুলির মধ্যে এই কেসগুলির উপস্থিতি রয়েছে।
নিকফ

952

জাভাস্ক্রিপ্টের অবজেক্টগুলিকে কী এবং মানগুলির মধ্যে মানচিত্র হিসাবে ভাবা যেতে পারে। deleteঅপারেটর এই কি, আরো সাধারণভাবে বস্তুর সম্পত্তি, একটি সময়ে এক নামে পরিচিত মুছে ফেলার জন্য ব্যবহার করা হয়।

var obj = {
  myProperty: 1    
}
console.log(obj.hasOwnProperty('myProperty')) // true
delete obj.myProperty
console.log(obj.hasOwnProperty('myProperty')) // false

deleteঅপারেটর না সরাসরি মেমরি মুক্ত আছে, এবং এটা শুধু এর মান বরাদ্দ থেকে পৃথক nullবা undefinedযে সম্পত্তি, একটি সম্পত্তিতে নিজেই বস্তু থেকে মুছে ফেলা হবে। মনে রাখবেন যদি মান একটি মুছে ফেলা সম্পত্তির একটি রেফারেন্স প্রকার (একটি বস্তু), এবং আপনার প্রোগ্রাম আরেকটি অংশ ছিল এখনও যে বস্তুর একটি রেফারেন্স ঝুলিতে, তাহলে সেই বস্তু, অবশ্যই, না আবর্জনা সংগ্রহ করা হবে না হওয়া পর্যন্ত সব রেফারেন্স আছে অদৃশ্য.

delete কেবল সেই বৈশিষ্ট্যগুলিতে কাজ করবে যার বিবরণকারী তাদের কনফিগারযোগ্য হিসাবে চিহ্নিত করে।


43
কোনও সম্পত্তি অপরিজ্ঞাত স্থির করে দেওয়া এখনও কোনও বস্তুর সম্পত্তি, সুতরাং এটি আপনার শেষ অনুচ্ছেদে ভুল লেখা না হলে এটি জিসি দ্বারা সরানো হবে না।
ল্যান্স

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

15
কোনও সম্পত্তি অপরিশোধিত হিসাবে নির্ধারিত এখনও কোনও বস্তুর সম্পত্তি, তাই এটি জিসি দ্বারা সরানো হবে না জিসি বৈশিষ্ট্য সম্পর্কে কোনও কিছুই পরিচালনা করে না। এটি মান সংগ্রহ করে এবং অপসারণ করে। যতক্ষণ না কোনও কিছুই কোনও মান (একটি অবজেক্ট, স্ট্রিং ইত্যাদি) উল্লেখ করে না, জিসি এটিকে স্মৃতি থেকে সরিয়ে দেয়।
meandre

8
বিটিডাব্লু, জাভাস্ক্রিপ্ট অবজেক্টে কোনও সম্পত্তি রয়েছে কিনা তা যাচাই করতে দ্বৈত সমস্যা। ব্যবহার মধ্যে অপারেটর নির্ভরযোগ্য কিন্তু ধীর। সম্পত্তিটি অপরিজ্ঞাত নয় কিনা তা পরীক্ষা করুন "সঠিক উত্তর নয়" তবে এটি দ্রুততর একটি উপায়। চেক
rdllopes

8
এই উত্তর এখনও প্রাসঙ্গিক? jsperf বর্তমানে নিচে, কিন্তু এই বেঞ্চমার্ক ইঙ্গিত যে গতি পার্থক্য একটি নিছক 25%, যা কোথাও নেই বলে মনে হয় ঘনিষ্ঠ করার "~ 100 বার ধীর" এই উত্তর হবে।
সার্বারবাস

248

var myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
    
delete myObject.regex;

console.log ( myObject.regex); // logs: undefined

এটি ফায়ারফক্স এবং ইন্টারনেট এক্সপ্লোরারে কাজ করে এবং আমি মনে করি এটি অন্য সমস্ত ক্ষেত্রে কাজ করে।


216

deleteঅপারেটর বস্তু থেকে বৈশিষ্ট্য মুছে ফেলার জন্য ব্যবহার করা হয়।

const obj = { foo: "bar" }
delete obj.foo
obj.hasOwnProperty("foo") // false

মনে রাখবেন, অ্যারেগুলির জন্য, এটি কোনও উপাদান অপসারণ করার মতো নয় । একটি অ্যারের থেকে কোনও উপাদান অপসারণ করতে Array#spliceবা ব্যবহার করুন Array#pop। উদাহরণ স্বরূপ:

arr // [0, 1, 2, 3, 4]
arr.splice(3,1); // 3
arr // [0, 1, 2, 4]

বিস্তারিত

deleteজাভাস্ক্রিপ্টে সি এবং সি ++ এর কীওয়ার্ডের সাথে আলাদা ফাংশন রয়েছে: এটি সরাসরি মেমরি মুক্ত করে না। পরিবর্তে, এর একমাত্র উদ্দেশ্য বস্তুগুলি থেকে বৈশিষ্ট্যগুলি সরিয়ে ফেলা।

অ্যারেগুলির জন্য, সূচকের সাথে সম্পর্কিত সম্পত্তি মুছে ফেলার ফলে একটি বিচ্ছিন্ন অ্যারে তৈরি হয় (যেমন এটিতে "গর্ত" সহ একটি অ্যারে)। বেশিরভাগ ব্রাউজারগুলি এই ফাঁকা অ্যারে সূচকগুলিকে "খালি" হিসাবে উপস্থাপন করে।

var array = [0, 1, 2, 3]
delete array[2] // [0, 1, empty, 3]

লক্ষ্য করুন deleteনূতন স্থান নির্দেশ করে না array[3]বা array[2]

জাভাস্ক্রিপ্টে বিভিন্ন অন্তর্নির্মিত ফাংশন স্পার্স অ্যারে আলাদাভাবে হ্যান্ডেল করে।

  • for...in খালি সূচি সম্পূর্ণরূপে এড়িয়ে যাবে।

  • একটি at তিহ্যগত forলুপ undefinedসূচকের মানটির জন্য ফিরে আসবে ।

  • যে কোনও পদ্ধতি ব্যবহার করে সূচকের মানটির জন্য Symbol.iteratorফিরে আসবে undefined

  • forEach, mapএবং reduceকেবল অনুপস্থিত সূচকটি এড়িয়ে যাবে।

সুতরাং, deleteএকটি অ্যারে থেকে উপাদানগুলি সরানোর সাধারণ ব্যবহারের ক্ষেত্রে অপারেটরটি ব্যবহার করা উচিত নয়। অ্যারেগুলির উপাদানগুলি অপসারণ এবং মেমরিটি পুনঃনির্ধারণের জন্য একটি উত্সর্গীকৃত পদ্ধতি রয়েছে: Array#splice()এবং Array#pop

অ্যারে # স্প্লাইস (শুরু করুন [, ডিলিটকাউন্ট [, আইটেম 1 [, আইটেম 2 [, ...]]]])

Array#spliceঅ্যারেটি রূপান্তরিত করে এবং কোনও সরানো সূচকগুলি ফেরত দেয়। deleteCountউপাদান সূচক থেকে সরিয়ে ফেলা হয় start, এবং item1, item2... itemNসূচি থেকে অ্যারের মধ্যে প্রবেশ করানো হয় start। যদি deleteCountবাদ দেওয়া হয় তবে আরম্ভের সূচনা থেকে সূচিপত্র থেকে উপাদানগুলি সরানো হবে।

let a = [0,1,2,3,4]
a.splice(2,2) // returns the removed elements [2,3]
// ...and `a` is now [0,1,4]

এছাড়া একটি একই নামের কিন্তু ভিন্ন, ফাংশন Array.prototype: Array#slice

অ্যারে # স্লাইস ([শুরু [, শেষ]]]

Array#sliceঅ-ধ্বংসাত্মক, এবং থেকে সূচিত সূচকগুলি সহ একটি নতুন অ্যারে startপ্রদান করে end। যদি endঅনির্ধারিতভাবে ছেড়ে দেওয়া হয় তবে এটি অ্যারের শেষের দিকে ডিফল্ট হয়। যদি endইতিবাচক হয় তবে এটি থামাতে শূন্য-ভিত্তিক অ-অন্তর্ভুক্ত সূচকটি নির্দিষ্ট করে । যদি endএটি নেতিবাচক হয় তবে এটি অ্যারের শেষ থেকে গণনা করে সূচকটি নির্দিষ্ট করে নির্দিষ্ট করে (যেমন -1 চূড়ান্ত সূচক বাদ দিবে)। যদি end <= start, ফলাফলটি একটি খালি অ্যারে হয়।

let a = [0,1,2,3,4]
let slices = [
    a.slice(0,2),
    a.slice(2,2),
    a.slice(2,3),
    a.slice(2,5) ]

//   a           [0,1,2,3,4]
//   slices[0]   [0 1]- - -   
//   slices[1]    - - - - -
//   slices[2]    - -[3]- -
//   slices[3]    - -[2 4 5]

এরে # পপ

Array#popএকটি অ্যারের থেকে শেষ উপাদানটি সরিয়ে দেয় এবং সেই উপাদানটি ফেরত দেয়। এই অপারেশন অ্যারের দৈর্ঘ্য পরিবর্তন করে।


12
এই পদ্ধতির মূল বস্তুটি সংশোধন করে না যা সম্ভবত অন্য কোথাও উল্লেখ করা যেতে পারে। এটি কীভাবে ব্যবহৃত হয় তার উপর নির্ভর করে এটি হয়ত সমস্যা হতে পারে না তবে এটি মনে রাখা দরকার।
তামাস সিজনেগ

19
@ বি 1 কে মিউজিক এখানে অ্যারে থেকে উপাদান মুছার উপায় রয়েছে: স্প্লাইস
ওয়ালফটোন

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

5
আমি spliceআপনার সম্পাদনাটিতে দেখতে পাচ্ছি না, তবে removeহওয়া উচিতArray.prototype.remove = function(index) { this.splice(index, 1); };
রাই-

1
এই নিবন্ধটি ষাঁড় পূর্ণ 1. এটি প্রশ্নের সমাধান করে না! ২. এটি ভাষার অনুকরণীয় অপব্যবহার এবং একটি অভিযোগ যে "এটি কার্যকর হয় না!" ৩. ক্রোকফোর্ডের আইডিসিঙ্ক্র্যাটিক ত্রুটির জন্য খালি অ্যারে সূচকটি বাতিল করার জন্য জাভাস্ক্রিপ্ট মুছুন অপারেটরটিকে দোষ দিবেন না । সে নালীর অর্থ বোঝে না - সে মনে করে এটি একটি ভুল। ভুলটি তার নিজস্ব এবং একা - প্রদত্ত অ্যারে সূচকটির মোছা মূল্যের কোনও শূন্যতা নেই। অ্যারেতে কোনও "গর্ত" নেই - এটি খালি সূচক। একেবারে বৈধ এবং প্রত্যাশিত।
বেকিম বাকাজ

195

পুরানো প্রশ্ন, আধুনিক উত্তর। অবজেক্ট ডেস্ট্রাকচারিং, একটি ECMAScript 6 বৈশিষ্ট্য ব্যবহার করে, এটি এতটা সহজ:

const { a, ...rest } = { a: 1, b: 2, c: 3 };

বা প্রশ্নের নমুনা সহ:

const myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
const { regex, ...newObject } = myObject;
console.log(newObject);

আপনি এটি ব্যাবেল ট্রাই-আউট সম্পাদকের ক্রিয়ায় দেখতে পারেন।


সম্পাদনা:

একই চলকটিতে পুনরায় সাইন ইন করতে, একটি ব্যবহার করুন let:

let myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
({ regex, ...myObject } = myObject);
console.log(myObject);

6
হতে পারে কারণ লক্ষ্যটি কোনও বস্তু থেকে কোনও সম্পত্তি অপসারণ করা, সম্পত্তি ব্যতীত কোনও নতুন তৈরি করা নয় ... যদিও, আপনার সমাধানটি আমার পছন্দসই, কারণ আমি অপরিবর্তনীয় উপায় পছন্দ করি।
ভিংট_সেনটাইমস

8
প্রশ্নটি " নতুন মাইবজেক্টটি শেষ করে " বলা হয়েছিল।
কোয়েন

1
একটি সম্পত্তি উইল শিবিকা সরানোর আপনার প্রকল্পের :) পরিবর্তে এটি উপলব্ধ হিসাবে থাকার জন্য আন্ডারস্কোর যোগ করার পদ্ধতি regexআপনার কাছে অন্য কোন পরিবর্তনশীল, যেমন তা নির্ধারণ করতে পারে _, কি ফলে বাতিল করতে যান মত ভাষায় ব্যবহার করা হয়: const { regex: _, ...newObject } = myObject;
কোয়েন

2
@ প্রণয়কুমার আশা করছিলাম এই সিনট্যাক্সটি কার্যকর হবে; const { [key], ...newObject } = myObject;তবে এটি হয় না, তাই ধ্বংসাত্মক মাধ্যমে এটি সম্ভব বলে আমি মনে করি না।
কোয়েন

2
সঙ্গে freeze()'ঘ এবং seal()' ঘ বস্তু, আপনি কেবল পারব না deleteএকটি সম্পত্তি। সুতরাং এটি একটি দুর্দান্ত বিকল্প। যদিও বেশিরভাগ ক্ষেত্রেই, সম্ভবত কোনও হ'ল / সিল করা বস্তু থেকে কোনও সম্পত্তি মুছে ফেলা বুদ্ধিমান হবে না, পুরো বিষয়টিটি আপনার ডেটা স্ট্রাকচার সম্পর্কে নির্দিষ্ট গ্যারান্টি দেওয়া, যার মধ্যে এই প্যাটার্নটি ক্ষুন্ন হবে। যেসব ক্ষেত্রে আপনাকে অ-ধ্বংসাত্মকভাবে কোনও বস্তুকে ডুপ করা দরকার তবে এর কিছু বৈশিষ্ট্য ছাড়াই এটি সঠিক
ব্র্যাডেন বেস্ট

118

সিনড্যাক্স স্প্রেড (ES6)

যার যার প্রয়োজন ...

এই থ্রেডে @ কোইনের উত্তরটি সম্পূর্ণ করতে, আপনি যদি স্প্রেড সিনট্যাক্স ব্যবহার করে গতিশীল পরিবর্তনশীল সরাতে চান তবে আপনি এটি এর মতো করতে পারেন:

const key = 'a';
        
const { [key]: foo, ...rest } = { a: 1, b: 2, c: 3 };

console.log(foo);  // 1
console.log(rest); // { b: 2, c: 3 }

* fooএর মান a(যা 1) এর সাথে একটি নতুন পরিবর্তনশীল হবে ।


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


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

delete obj[key];


Reassignment
যতো তাড়াতাড়ি 2X বেশিdelete, তবে সম্পত্তিনামোছা হয়েছে এবং iterated করা যেতে পারে।

obj[key] = null;
obj[key] = false;
obj[key] = undefined;


স্প্রেড অপারেটর
এইES6অপারেটরটি বিদ্যমান অবজেক্টটিকে পরিবর্তন না করে কোনও বৈশিষ্ট্য বাদ দিয়ে আমাদের ব্র্যান্ডের নতুন অবজেক্ট ফিরিয়ে আনতে সহায়তা করে। ক্ষতিটি হ'ল উপরের তুলনায় এর আরও খারাপ পারফরম্যান্স রয়েছে এবং যখন আপনাকে একবারে অনেকগুলি সম্পত্তি সরিয়ে ফেলতে হবে তখন ব্যবহার করার পরামর্শ দেওয়া হয়নি।

{ [key]: val, ...rest } = obj;

2
আমি মনে করি যে বেশিরভাগ জেএস ইঞ্জিন ইতোমধ্যে এটি প্রয়োগ করে নিলেও অবজেক্ট লিটারেলের স্প্রেড / বাক্য বাক্য গঠনটি কেবল ES2018 (ES9) এ অন্তর্ভুক্ত ছিল।
ট্রিনকোট

2
@ ট্রিনকোট এটি ২০১৪ সালে প্রথম প্রকাশিত হয়েছিল ( github.com/tc39/proposal-object-rest-spread ) এবং এটি একটি ES6 (ECMAScript 2015 ওরফে ECMAScript 6th ষ্ঠ সংস্করণ) বৈশিষ্ট্যযুক্ত। তবে, আমি ভুল হলেও, আমি মনে করি না যে এটির উত্তর প্রসঙ্গে কোনও পার্থক্য রয়েছে।
লাইওর এলরুম

2
লিঙ্কটি ES6 কে বোঝায় যেখানে প্রকৃতপক্ষে স্প্রেড সিনট্যাক্স অ্যারেগুলির জন্য প্রবর্তিত হয়েছিল, কিন্তু তারপরে এটি অবজেক্ট লিটারালগুলির জন্য অনুরূপ কিছু প্রস্তাব দেয়। যদি আমার ভুল না হয় তবে দ্বিতীয় অংশটি কেবল ES9 এ সংযুক্ত করা হয়েছিল।
ট্রিনকোট

98

অন্য বিকল্প হ'ল অ্যান্ডসকোর.জেএস লাইব্রেরি ব্যবহার করা ।

নোট করুন _.pick()এবং _.omit()উভয়ই অবজেক্টের একটি অনুলিপি ফিরিয়ে দেন এবং আসল অবজেক্টটি সরাসরি পরিবর্তন করেন না। মূল বস্তুকে ফলাফল বরাদ্দ করার কৌশলটি করা উচিত (দেখানো হয়নি)।

তথ্যসূত্র: লিঙ্ক _.পিক (অবজেক্ট, * কী)

শ্বেত তালিকাভুক্ত কীগুলির (বা বৈধ কীগুলির অ্যারে) কেবলমাত্র মান থাকতে ফিল্টার করে অবজেক্টের একটি অনুলিপি ফেরান।

var myJSONObject = 
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

_.pick(myJSONObject, "ircEvent", "method");
=> {"ircEvent": "PRIVMSG", "method": "newURI"};

তথ্যসূত্র: লিংক _.মিট (অবজেক্ট, * কী)

কালো তালিকাভুক্ত কী (বা কীগুলির অ্যারে) বাদ দিতে ফিল্টারযুক্ত অবজেক্টের একটি অনুলিপি ফিরিয়ে দিন।

var myJSONObject = 
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

_.omit(myJSONObject, "regex");
=> {"ircEvent": "PRIVMSG", "method": "newURI"};

অ্যারেগুলির জন্য, _.filter()এবং _.reject()একইভাবে ব্যবহার করা যেতে পারে।


4
মনে রাখবেন যে যদি আপনার অবজেক্টের কীগুলি সংখ্যা হয় তবে আপনার প্রয়োজন হতে পারে_.omit(collection, key.toString())
জর্ডান আর্সেনো

হুঁ মমম .... ইন্ডসকোরটি এর চেয়ে delete obj[prop]~ 100x কম ধীর obj[prop] = undefined
জ্যাক গিফিন

52

আপনার প্রশ্নের শিরোনামে আপনি যে শব্দটি ব্যবহার করেছেন Remove a property from a JavaScript object, তা বিভিন্নভাবে ব্যাখ্যা করা যেতে পারে। একটি হ'ল এটি পুরো মেমোরির জন্য অপসারণ করা এবং অবজেক্ট কীগুলির তালিকা বা অন্যটি হ'ল এটি আপনার অবজেক্ট থেকে অপসারণ করা। এটি অন্য কয়েকটি deleteউত্তরে যেমন উল্লেখ করা হয়েছে, মূলশব্দটি মূল অংশ। ধরা যাক আপনার মতো জিনিসটি রয়েছে:

myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

যদি তুমি করো:

console.log(Object.keys(myJSONObject));

ফলাফলটি হবে:

["ircEvent", "method", "regex"]

আপনি আপনার অবজেক্ট কী থেকে সেই নির্দিষ্ট কীটি মুছতে পারেন:

delete myJSONObject["regex"];

তারপরে আপনার অবজেক্টগুলির কীটি হ'ল Object.keys(myJSONObject):

["ircEvent", "method"]

তবে মুল বক্তব্যটি হ'ল আপনি যদি মেমোরিটির প্রতি যত্নশীল হন এবং আপনি বস্তুটি মেমরি থেকে সরিয়ে ফেলতে চান তবে কীটি মোছার আগে এটি নালায় সেট করার পরামর্শ দেওয়া হয়:

myJSONObject["regex"] = null;
delete myJSONObject["regex"];

এখানে অন্য গুরুত্বপূর্ণ পয়েন্টটি হ'ল একই অবজেক্টের সাথে আপনার অন্যান্য উল্লেখগুলি সম্পর্কে সতর্কতা অবলম্বন করা। উদাহরণস্বরূপ, আপনি যদি একটি ভেরিয়েবল তৈরি করেন তবে:

var regex = myJSONObject["regex"];

অথবা এটিকে অন্য কোনও বস্তুতে নতুন পয়েন্টার হিসাবে যুক্ত করুন:

var myOtherObject = {};
myOtherObject["regex"] = myJSONObject["regex"];

তারপরেও যদি আপনি এটিকে আপনার অবজেক্ট থেকে সরিয়ে দেন, তবুও myJSONObjectসেই নির্দিষ্ট বস্তুটি মেমরি থেকে মুছবে না, যেহেতু regexভেরিয়েবল এবং myOtherObject["regex"]এখনও তাদের মান রয়েছে। তাহলে আমরা কীভাবে নিশ্চিতভাবে স্মৃতি থেকে বস্তুটি সরিয়ে ফেলতে পারি?

উত্তর হবে সমস্ত রেফারেন্স আপনার কোড আপনি আছেন, খুব বস্তুর প্রতি ইঙ্গিত মুছতে এবং ব্যবহার করবেন varযে বস্তুর নতুন রেফারেন্স তৈরি করতে বিবৃতিvarবিবৃতি সংক্রান্ত এই শেষ পয়েন্টটি , আমরা সাধারণত যে সমস্যার মুখোমুখি হয়েছি তার মধ্যে অন্যতম একটি গুরুত্বপূর্ণ বিষয়, কারণ ব্যবহার করা হচ্ছেvar বিবৃতি তৈরি করা বস্তুকে সরিয়ে ফেলতে বাধা দিতে পারে।

যার অর্থ এই ক্ষেত্রে আপনি সেই বস্তুটি সরাতে পারবেন না কারণ আপনি regexকোনও varবিবৃতি দিয়ে ভেরিয়েবল তৈরি করেছেন এবং যদি আপনি তা করেন:

delete regex; //False

ফলাফলটি হবে falseযার অর্থ আপনার মোছার বিবৃতিটি আপনার প্রত্যাশার মতো কার্যকর হয়নি। তবে আপনি যদি আগে এই পরিবর্তনশীলটি তৈরি না করে থাকেন এবং আপনি কেবল myOtherObject["regex"]আপনার সর্বশেষ বিদ্যমান রেফারেন্স হিসাবে থাকেন তবে আপনি কেবল এটির মতো সরিয়ে এটি করতে পারতেন:

myOtherObject["regex"] = null;
delete myOtherObject["regex"];

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


আপডেট: @ এজেন্টকে ধন্যবাদ:

মুছে ফেলার আগে একটি সম্পত্তি সেট করে ফেললে তা পুরোপুরি কার্যকর হয় না (যদি না অবজেক্ট.সিল দ্বারা বস্তুটি সিল করা না হয় এবং মোছা ব্যর্থ হয় That's যদি আপনি সুনির্দিষ্টভাবে চেষ্টা না করেন তবে সাধারণত এটি ঘটে না)।

আরও তথ্য পেতে Object.seal: অবজেক্ট.সিল ()


আপনি ভুল - কেবলমাত্র জাভাস্ক্রিপ্টে রেফারেন্স দ্বারা অবজেক্টগুলি পাস করা হয়, সুতরাং যদি myJSONObject.regexএর মান একটি স্ট্রিং হয় এবং আপনি এটি অন্য কোনও বস্তুর কাছে অর্পণ করেন, অন্য বস্তুর কাছে এই মানটির একটি অনুলিপি রয়েছে।
মিশা পেরেকোভস্কি

আপনি ঠিক বলেছেন এবং এটি একটি উক্তি: "একই বস্তুর সাথে আপনার অন্যান্য উল্লেখগুলি সম্পর্কে সতর্কতা অবলম্বন করা।"
মেহরান হাতামী

43

ECMAScript 2015 (বা ES6) বিল্ট-ইন রিফ্লেক অবজেক্টের সাথে আসে। পরামিতি হিসাবে টার্গেট অবজেক্ট এবং প্রপার্টি কী সহ রিফ্লেক.ডিলিটপ্রোপার্টি () ফাংশন কল করে অবজেক্ট সম্পত্তি মুছে ফেলা সম্ভব :

Reflect.deleteProperty(myJSONObject, 'regex');

যা এর সমান:

delete myJSONObject['regex'];

তবে যদি অবজেক্টটির সম্পত্তি কনফিগারযোগ্য না হয় তবে এটি মুছে ফেলা যাবে না অপসারণকারীকে মুছে ফেলুন:

let obj = Object.freeze({ prop: "value" });
let success = Reflect.deleteProperty(obj, "prop");
console.log(success); // false
console.log(obj.prop); // value

অবজেক্ট.ফ্রিজে () বস্তুর সমস্ত বৈশিষ্ট্য কনফিগারযোগ্য নয় (অন্যান্য জিনিসগুলি ছাড়াও)। deletePropertyফাংশন ( অপারেটর মোছার পাশাপাশি ) এর falseকোনও বৈশিষ্ট্য মুছতে চেষ্টা করলে ফিরে আসে । সম্পত্তি কনফিগারযোগ্য হলে এটি ফিরে আসে true, এমনকি সম্পত্তি উপস্থিত না থাকলেও।

কড়া মোড ব্যবহার করার সময় deleteএবং এর মধ্যে পার্থক্য deleteProperty:

"use strict";

let obj = Object.freeze({ prop: "value" });
Reflect.deleteProperty(obj, "prop"); // false
delete obj["prop"];
// TypeError: property "prop" is non-configurable and can't be deleted

1
@ গথডো এর আরও সুবিধা রয়েছে, বিশেষত যখন আপনার কিছু কার্যকরী জিনিস করার দরকার হয়। যেমন আপনি, পরিবর্তনশীল ফাংশন নির্ধারণ একটি আর্গুমেন্ট বা ব্যবহারের হিসাবে প্রেরণ করতে পারেন apply, call, bindফাংশন ...
madox2

41

মনে করুন যে আপনার কাছে এমন কোনও জিনিস রয়েছে যা দেখতে এটির মতো দেখাচ্ছে:

var Hogwarts = {
    staff : [
        'Argus Filch',
        'Filius Flitwick',
        'Gilderoy Lockhart',
        'Minerva McGonagall',
        'Poppy Pomfrey',
        ...
    ],
    students : [
        'Hannah Abbott',
        'Katie Bell',
        'Susan Bones',
        'Terry Boot',
        'Lavender Brown',
        ...
    ]
};

কোনও বস্তুর সম্পত্তি মুছে ফেলা হচ্ছে

আপনি যদি পুরো staffঅ্যারেটি ব্যবহার করতে চান তবে এটি করার সঠিক উপায়টি হ'ল:

delete Hogwarts.staff;

বিকল্পভাবে, আপনি এটি করতে পারেন:

delete Hogwarts['staff'];

একইভাবে, সম্পূর্ণ শিক্ষার্থীদের অ্যারে অপসারণ কল delete Hogwarts.students;বা মাধ্যমে করা হবে delete Hogwarts['students'];

একটি অ্যারে সূচি মোছা হচ্ছে

এখন, আপনি যদি কোনও একক কর্মী সদস্য বা ছাত্রকে সরাতে চান তবে পদ্ধতিটি কিছুটা আলাদা, কারণ উভয় সম্পত্তিই তাদের নিজস্ব ra

আপনি যদি আপনার কর্মী সদস্যের সূচকটি জানেন, আপনি কেবল এটি করতে পারেন:

Hogwarts.staff.splice(3, 1);

আপনি যদি সূচকটি না জানেন তবে আপনাকে একটি সূচক অনুসন্ধানও করতে হবে:

Hogwarts.staff.splice(Hogwarts.staff.indexOf('Minerva McGonnagall') - 1, 1);

বিঃদ্রঃ

আপনি যখন প্রযুক্তিগতভাবে deleteকোনও অ্যারের জন্য ব্যবহার করতে পারেন , এটি ব্যবহারের Hogwarts.staff.lengthপরে উদাহরণস্বরূপ কল করার সময় ভুল ফলাফল পাওয়া যাবে। অন্য কথায়, deleteউপাদানটি সরিয়ে ফেলবে, তবে এটি lengthসম্পত্তির মান আপডেট করবে না । ব্যবহারের deleteফলে আপনার সূচকেও বিশৃঙ্খলা সৃষ্টি হবে।

সুতরাং, কোনও বস্তু থেকে মানগুলি মুছে ফেলার সময় সর্বদা প্রথমে বিবেচনা করুন আপনি বস্তুর বৈশিষ্ট্য নিয়ে কাজ করছেন কিনা বা আপনি অ্যারের মানগুলি নিয়ে কাজ করছেন কিনা এবং তার ভিত্তিতে উপযুক্ত কৌশল বেছে নিন choose

আপনি যদি এটি নিয়ে পরীক্ষা করতে চান তবে আপনি এই ফিডলটিকে একটি প্রাথমিক পয়েন্ট হিসাবে ব্যবহার করতে পারেন ।


আমি মনে করি আপনার spliceপরিবর্তে সবসময় অ্যারে ব্যবহার করা উচিত delete
জোয়েল ট্রুগার

@ জোয়েলট্রেউগার: আমি যা বলছি ;-)
জন

হ্যাঁ. আমার মন্তব্যটি এমন যে deleteকোনও জিনিস হওয়া উচিত নয়। এটিই spliceওপি খুঁজছিল।
জোয়েল ট্রুগার 21

1
@ জোয়েলট্রেগার: আমি যেমন ব্যাখ্যা করার চেষ্টা করেছি, deleteঅবজেক্টের বৈশিষ্ট্য এবং spliceঅ্যারের উপাদানগুলির জন্য ব্যবহার করা উচিত ।
জন স্লেজারগুলি

স্প্লাইস সত্যিই ধীর। যদিও এটি deleteঅ্যারের পরিবর্তে ব্যবহার করা উচিত , তবুও এটিকে কেন্দ্র করে কোডটি তৈরি না করাটাই বুদ্ধিমানের কাজ।
জ্যাক গিফিন

39

ES6 ব্যবহার:

(ডেস্ট্রাকচারিং + স্প্রেড অপারেটর)

const myObject = {
    regex: "^http://.*",
    b: 2,
    c: 3
};
const { regex, ...noRegex } = myObject;
console.log(noRegex); // => { b: 2, c: 3 }

আমি মনে করি না এটি একটি ES6 বৈশিষ্ট্য, তবে একটি যা কেবল ES9 এ অন্তর্ভুক্ত ছিল।
ট্রিনকোট

সুতরাং আপনি যেমন লিখছেন তেমন আপনি ES6 ব্যবহার করছেন না, তবে ES9 ... ;-)
ট্রিনকোট

2
এটি কোনও বস্তু থেকে কোনও সম্পত্তি অপসারণ করছে না তবে সেই সম্পত্তি ব্যতীত একটি নতুন অবজেক্ট তৈরি করছে।
জর্ডি নেবোট

32

আমি ব্যক্তিগতভাবে ব্যবহার Underscore.js বা Lodash বস্তু এবং অ্যারে ম্যানিপুলেশন জন্য:

myObject = _.omit(myObject, 'regex');

31

ডিলিট অপারেটর তা করার সবচেয়ে ভাল উপায়।

দেখানোর জন্য একটি জীবন্ত উদাহরণ:

var foo = {bar: 'bar'};
delete foo.bar;
console.log('bar' in foo); // Logs false, because bar was deleted from foo.

এটি লক্ষণীয় যে, deleteঅপারেটরটি আবর্জনা সংগ্রহের ক্ষেত্রে ব্যবহারের ক্ষেত্রে স্বাস্থ্যকর হলেও এটি অপ্রত্যাশিতভাবে ধীর হতে পারে , একই কারণে কোনও ছোট অংশে নয়।
জন ওয়েইজ 6:58

29

সম্পত্তি ছাড়াই ক্লোন অবজেক্ট:

উদাহরণ স্বরূপ:

let object = { a: 1, b: 2, c: 3 };   

এবং আমাদের 'এ' মুছতে হবে।

1. স্পষ্ট প্রপ কী সহ:

const { a, ...rest } = object;
object = rest;

2. পরিবর্তনশীল প্রপ কী সহ:

const propKey = 'a';
const { [propKey]: propValue, ...rest } = object;
object = rest;

3. শীতল তীর ফাংশন:

const removePropery = (propKey, { [propKey]: propValue, ...rest }) => rest;

object = removePropery('a', object);

4. একাধিক সম্পত্তি জন্য

const removeProperties = (object, ...keys) => Object.entries(object).reduce((prev, [key, value]) => ({...prev, ...(!keys.includes(key) && { [key]: value }) }), {})

ব্যবহার

object = removeProperties(object, 'a', 'b') // result => { c: 3 }

অথবা

    const propsToRemove = ['a', 'b']
    object = removeProperties(object, ...propsToRemove) // result => { c: 3 }

1
স্লিক তীর ফাংশন!
জিলসভ

27

ব্যবহার ডিলিট পদ্ধতি যে কাজ করতে সবচেয়ে ভালো উপায় প্রতি MDN বিবরণ হিসাবে, তাহলে ডিলিট অপারেটর একটি বস্তু থেকে একটি সম্পত্তি সরিয়ে ফেলা হয়। সুতরাং আপনি সহজভাবে লিখতে পারেন:

delete myObject.regex;
// OR
delete myObject['regex'];

মুছুন অপারেটর একটি অবজেক্ট থেকে প্রদত্ত সম্পত্তি সরিয়ে দেয়। সফল মুছে ফেলার পরে, এটি সত্য হবে, অন্যথায় মিথ্যা ফিরে আসবে। তবে, নিম্নলিখিত পরিস্থিতিতে বিবেচনা করা গুরুত্বপূর্ণ:

  • আপনি যে সম্পত্তিটি মুছে ফেলার চেষ্টা করছেন তা যদি বিদ্যমান না থাকে তবে মুছার কোনও প্রভাব থাকবে না এবং সত্য ফিরে আসবে

  • যদি একই নামের কোনও সম্পত্তি যদি বস্তুর প্রোটোটাইপ শৃঙ্খলে উপস্থিত থাকে তবে মুছে ফেলার পরে অবজেক্টটি প্রোটোটাইপ শৃঙ্খলা থেকে সম্পত্তিটি ব্যবহার করবে (অন্য কথায়, মুছলে কেবল তার নিজস্ব বৈশিষ্ট্যের উপর প্রভাব থাকে)।

  • Var এর সাথে ঘোষিত যে কোনও সম্পত্তি বৈশ্বিক সুযোগ বা কোনও ফাংশনের সুযোগ থেকে মোছা যাবে না।

  • যেমন, মুছুন বিশ্বব্যাপী সুযোগের কোনও ফাংশন মুছতে পারে না (এটি কোনও ফাংশন সংজ্ঞা বা কোনও ফাংশন (এক্সপ্রেশন) থেকে অংশ কিনা।

  • ফাংশনগুলি যা কোনও সামগ্রীর অংশ (
    বৈশ্বিক সুযোগ ব্যতীত) মোছার সাথে মুছে ফেলা যায়।

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

নিম্নলিখিত স্নিপেট আরও একটি সাধারণ উদাহরণ দেয়:

var Employee = {
      age: 28,
      name: 'Alireza',
      designation: 'developer'
    }
    
    console.log(delete Employee.name);   // returns true
    console.log(delete Employee.age);    // returns true
    
    // When trying to delete a property that does 
    // not exist, true is returned 
    console.log(delete Employee.salary); // returns true

আরও উদাহরণ সম্পর্কে আরও তথ্যের জন্য, নীচের লিঙ্কটি দেখুন:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete


22

আর একটি সমাধান, ব্যবহার করে Array#reduce

var myObject = {
  "ircEvent": "PRIVMSG",
  "method": "newURI",
  "regex": "^http://.*"
};

myObject = Object.keys(myObject).reduce(function(obj, key) {
  if (key != "regex") {           //key you want to remove
    obj[key] = myObject[key];
  }
  return obj;
}, {});

console.log(myObject);

তবে এটি আসল বস্তুটিকে রূপান্তরিত করবে । আপনি যদি নির্দিষ্ট কী ব্যতীত কোনও নতুন অবজেক্ট তৈরি করতে চান , কেবলমাত্র একটি নতুন ভেরিয়েবলের জন্য হ্রাস কার্যটি নির্ধারণ করুন, যেমন:

(ES6)

const myObject = {
  ircEvent: 'PRIVMSG',
  method: 'newURI',
  regex: '^http://.*',
};

const myNewObject = Object.keys(myObject).reduce((obj, key) => {
  key !== 'regex' ? obj[key] = myObject[key] : null;
  return obj;
}, {});

console.log(myNewObject);


21

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

এই নতুন unsetফাংশনটি লেখার কারণ হ'ল হ্যাশ_ম্যাপে অন্য সমস্ত ভেরিয়েবলের সূচক রাখা। নিম্নলিখিত উদাহরণটি দেখুন এবং দেখুন "টেস্ট 2" এর সূচি হ্যাশ_ম্যাপ থেকে কোনও মান অপসারণ করার পরে কীভাবে পরিবর্তন হয়নি।

function unset(unsetKey, unsetArr, resort){
  var tempArr = unsetArr;
  var unsetArr = {};
  delete tempArr[unsetKey];
  if(resort){
    j = -1;
  }
  for(i in tempArr){
    if(typeof(tempArr[i]) !== 'undefined'){
      if(resort){
        j++;
      }else{
        j = i;
      }
      unsetArr[j] = tempArr[i];
    }
  }
  return unsetArr;
}

var unsetArr = ['test','deletedString','test2'];

console.log(unset('1',unsetArr,true)); // output Object {0: "test", 1: "test2"}
console.log(unset('1',unsetArr,false)); // output Object {0: "test", 2: "test2"}

20

এখানে অনেক ভাল উত্তর রয়েছে তবে আমি জাভাস্ক্রিপ্টে কোনও সম্পত্তি মুছে ফেলার জন্য মুছে ফেলা ব্যবহার করার সময় এটির চিমটি দিতে চাই, ততক্ষণে প্রথমে ত্রুটি রোধ করার জন্য সম্পত্তিটি উপস্থিত রয়েছে কিনা তা যাচাই করা বুদ্ধিমানের কাজ।

যেমন

var obj = {"property":"value", "property2":"value"};

if (obj && obj.hasOwnProperty("property2")) {
  delete obj.property2;
} else {
  //error handling
}

জাভাস্ক্রিপ্টের গতিশীল প্রকৃতির কারণে প্রায়শই এমন ঘটনা ঘটে যা আপনি কেবল জানেন না যে সম্পত্তিটি রয়েছে কি না or && এর পূর্বে আপত্তি আছে কিনা তা যাচাই করাও নিশ্চিত করে যে আপনি একটি অনির্ধারিত অবজেক্টে hasOwNProperty () ফাংশন কল করার কারণে কোনও ত্রুটি নিক্ষেপ করছেন না।

দুঃখিত, এটি যদি আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে যোগ না করে তবে আমি বিশ্বাস করি যে এটি বস্তু এবং তাদের বৈশিষ্ট্যগুলি পরিচালনা করার সময় মানিয়ে নেওয়ার জন্য এটি একটি ভাল ডিজাইন।


2
foo.bar মুছুন এমনকি বার উপস্থিত না থাকলেও কাজ করে, তাই আপনার পরীক্ষাটি কিছুটা বেশি, আইএমএইচও।
ফিলোহো

@ ফিলিও আপনি যেখানে জাভাস্ক্রিপ্ট চালাচ্ছেন তার উপর নির্ভর করে। নোড.জেজেসে আমি বিশ্বাস করি এটি আপনার সার্ভারকে ক্রাশ করে।
উইলেম

2
delete foo.bar;foo মিথ্যাবাদী হলে, বা আপনি যদি কঠোর মোডে থাকেন এবং foo কোনও অ-কনফিগারযোগ্য বার সম্পত্তি সহ একটি অবজেক্ট থাকে কেবল তখনই তার ব্যতিক্রম ছুঁড়ে।
ম্যাকিল

আমি এর সাথে যে সঠিক সমস্যাটি করেছি তা আমি মনে করি না তবে আমার মনে হয় যখন foo নিজেই উপস্থিত না থাকে এবং আপনি এটির সম্পত্তি মুছতে চেষ্টা করেন তখন সমস্যাটি উপস্থিত হতে পারে।
উইলিয়াম

হ্যাঁ, foo উপস্থিত থাকলে আপনাকে পরীক্ষা করে দেখতে হবে, অন্যথায় foo.bar একটি ব্যতিক্রম ছুঁড়ে ফেলবে, তবে বারটি মুছে ফেলার আগে আপনার অস্তিত্বটি পরীক্ষা করার দরকার নেই। এটি আমার মন্তব্যের "অত্যধিক" অংশ। :-)
ফিলোহো

16

রামদা # বিযুক্তি ব্যবহার করে আপনি বৈশিষ্ট্য ছাড়াই একটি নতুন অবজেক্ট পাবেন regex:

const newObject = R.dissoc('regex', myObject);
// newObject !== myObject

একই প্রভাবটি অর্জন করতে আপনি অন্যান্য ফাংশনও ব্যবহার করতে পারেন - বাদ দিন, বেছে নিন, ...


15

নিম্নলিখিত পদ্ধতি ব্যবহার করে দেখুন। Objectসম্পত্তি মান নির্ধারণ করুন undefined। তারপরে stringifyবস্তু এবং parse

 var myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

myObject.regex = undefined;
myObject = JSON.parse(JSON.stringify(myObject));

console.log(myObject);


1
এছাড়াওJSON.parse(JSON.stringify({ ...myObject, regex: undefined }))
noisypixy

12

আপনি যদি কোনও সম্পত্তি গভীরভাবে নেস্টেড কোনও সম্পত্তি মুছতে চান তবে আপনি দ্বিতীয় যুক্তি হিসাবে সম্পত্তিটির পথে নিম্নলিখিত পুনরাবৃত্ত ফাংশনটি ব্যবহার করতে পারেন:

var deepObjectRemove = function(obj, path_to_key){
    if(path_to_key.length === 1){
        delete obj[path_to_key[0]];
        return true;
    }else{
        if(obj[path_to_key[0]])
            return deepObjectRemove(obj[path_to_key[0]], path_to_key.slice(1));
        else
            return false;
    }
};

উদাহরণ:

var a = {
    level1:{
        level2:{
            level3: {
                level4: "yolo"
            }
        }
    }
};

deepObjectRemove(a, ["level1", "level2", "level3"]);
console.log(a);

//Prints {level1: {level2: {}}}

এই ফাংশনটি কবজির মতো কাজ করে, তবে কেন আমাদের সত্য প্রত্যাবর্তন এবং মিথ্যা প্রত্যাবর্তনের দরকার? কোডটির আমার সংস্করণ: codepen.io/anon/pen/rwbppY । আমার সংস্করণ কোনও ক্ষেত্রে ব্যর্থ হবে?
দৈনিক

@ witty2017 এটি ব্যর্থ হবে না। আমি যে জায়গাটিতে ফাংশনটি ব্যবহার করেছি সে জায়গারও সম্পত্তি ইতিমধ্যে বিদ্যমান কিনা তা যাচাই করা দরকার। সম্পত্তি উপস্থিত না থাকলে, এটি মিথ্যা ফিরে আসবে। যদি এটি সম্পত্তিটি সন্ধান করে এবং এটি মুছে ফেলে তবে এটি সত্যে ফিরে আসবে।
আয়ুষ্প

8

আপনি deleteকীওয়ার্ডটি ব্যবহার করে কোনও জিনিসের কোনও সম্পত্তি মুছতে পারেন ।

উদাহরণ স্বরূপ:

var obj = {key1:"val1",key2:"val2",key3:"val3"}

যে কোনও সম্পত্তি অপসারণ করতে, বলুন key1, এর deleteমতো কীওয়ার্ডটি ব্যবহার করুন :

delete obj.key1

অথবা আপনি অ্যারের মতো স্বরলিপি ব্যবহার করতে পারেন:

delete obj[key1]

সূত্র: MDN


8

অবজেক্ট.অ্যাসাইন () & অবজেক্ট.কিজ () এবং অ্যারে.ম্যাপ ()

const obj = {
    "Filters":[
        {
            "FilterType":"between",
            "Field":"BasicInformationRow.A0",
            "MaxValue":"2017-10-01",
            "MinValue":"2017-09-01",
            "Value":"Filters value"
        }
    ]
};

let new_obj1 = Object.assign({}, obj.Filters[0]);
let new_obj2 = Object.assign({}, obj.Filters[0]);

/*

// old version

let shaped_obj1 = Object.keys(new_obj1).map(
    (key, index) => {
        switch (key) {
            case "MaxValue":
                delete new_obj1["MaxValue"];
                break;
            case "MinValue":
                delete new_obj1["MinValue"];
                break;
        }
        return new_obj1;
    }
)[0];


let shaped_obj2 = Object.keys(new_obj2).map(
    (key, index) => {
        if(key === "Value"){
            delete new_obj2["Value"];
        }
        return new_obj2;
    }
)[0];


*/


// new version!

let shaped_obj1 = Object.keys(new_obj1).forEach(
    (key, index) => {
        switch (key) {
            case "MaxValue":
                delete new_obj1["MaxValue"];
                break;
            case "MinValue":
                delete new_obj1["MinValue"];
                break;
            default:
                break;
        }
    }
);

let shaped_obj2 = Object.keys(new_obj2).forEach(
    (key, index) => {
        if(key === "Value"){
            delete new_obj2["Value"];
        }
    }
);


7

'মুছুন' এমন ড্যানের বক্তব্য খুব ধীর এবং তিনি যে মানদণ্ডটি পোস্ট করেছিলেন তাতে সন্দেহ হয়েছিল। সুতরাং আমি ক্রোম 59 এ নিজেই পরীক্ষা চালিয়েছি It মনে হয় 'মুছুন' প্রায় 30 গুণ কম গতিতে:

var iterationsTotal = 10000000;  // 10 million
var o;
var t1 = Date.now(),t2;
for (let i=0; i<iterationsTotal; i++) {
   o = {a:1,b:2,c:3,d:4,e:5};
   delete o.a; delete o.b; delete o.c; delete o.d; delete o.e;
}
console.log ((t2=Date.now())-t1);  // 6135
for (let i=0; i<iterationsTotal; i++) {
   o = {a:1,b:2,c:3,d:4,e:5};
   o.a = o.b = o.c = o.d = o.e = undefined;
}
console.log (Date.now()-t2);  // 205

নোট করুন যে আমি অন্য ক্রিয়াকলাপের ফলে প্রভাবকে হ্রাস করতে লক্ষ্য করে একটি লুপ চক্রে একাধিক 'মুছুন' অপারেশন করেছি।


7

"regex"সম্পত্তি ব্যতীত একটি নতুন অবজেক্ট তৈরি করার বিষয়টি বিবেচনা করুন কারণ আসল অবজেক্টটি সর্বদা আপনার প্রোগ্রামের অন্যান্য অংশ দ্বারা উল্লেখ করা যেতে পারে। সুতরাং আপনি এটি কারচুপি করা এড়ানো উচিত।

const myObject = {
    "ircEvent": "PRIVMSG",
    "method": "newURI",
    "regex": "^http://.*"
};

const { regex, ...newMyObject } = myObject;

console.log(newMyObject);


SyntaxError: Unexpected token '...'. Expected a property name.?
Krzysztof Przygoda

এটি একটি আধুনিক ব্রাউজার যেমন ফায়ারফক্স, ক্রোমিয়াম বা সাফারি দিয়ে চেষ্টা করুন। এবং আমি আশা করি এটি এজের সাথেও কাজ করবে।
আদর্শবক্সার

বিকল্প হিসাবে, যদি আপনার গ্রাহকরা আপনাকে পুরানো ব্রাউজারগুলিকে সমর্থন করতে জোর করে, আপনি টাইপস্ক্রিপ্ট ব্যবহার করে বিবেচনা করতে পারেন যা আপনার কোডটিকে উত্তীর্ণ সিনট্যাক্সে স্থানান্তর করে (+ আপনাকে স্ট্যাটিক ধরণের সুরক্ষার সুবিধা দেয়)।
আইডিয়াবক্সার

7

জাভাস্ক্রিপ্টে সম্পত্তি অপসারণ

এই পৃষ্ঠায় অনেকগুলি বিভিন্ন বিকল্প উপস্থাপন করা হয়েছে, বেশিরভাগ বিকল্পগুলি ভুল because বা উত্তরগুলি সদৃশ হওয়ার কারণে নয় — তবে উপযুক্ত কৌশলটি আপনি যে পরিস্থিতিতে আছেন এবং আপনার এবং / অথবা আপনি যে কাজগুলি করছেন তার উপর নির্ভর করে because দল পূরণের চেষ্টা করছে। আপনার দ্ব্যর্থহীন প্রশ্নের জবাব দেওয়ার জন্য আপনার জানা দরকার:

  1. আপনি টার্গেট করছেন ECMAScript এর সংস্করণ
  2. আপনি যে সমস্ত অবজেক্টের ধরণের বৈশিষ্ট্যগুলি মুছে ফেলতে চান এবং যে ধরণের সম্পত্তির নাম বাদ দিতে সক্ষম হবেন সেগুলির পরিসীমা (কেবল স্ট্রিংস? প্রতীক? স্বেচ্ছাসেবী বস্তু থেকে দুর্বল রেফারেন্স ম্যাপ করা যায়? এগুলি এখন কয়েক বছরের জন্য জাভাস্ক্রিপ্টে সম্পত্তি পয়েন্টারগুলির মতো হয়ে গেছে) )
  3. আপনি এবং আপনার দল ব্যবহার করে প্রোগ্রামিং নীতি / নিদর্শন। আপনি কি কার্যকরী পদ্ধতির পক্ষে এবং রূপান্তরটি আপনার দলে ভারবোটেন, বা আপনি বন্য পশ্চিমের মিউটিভেটিভ অবজেক্ট-ভিত্তিক কৌশলগুলি ব্যবহার করেন?
  4. আপনি কি খাঁটি জাভাস্ক্রিপ্টে এটি অর্জন করতে চাইছেন বা আপনি কোনও তৃতীয় পক্ষের লাইব্রেরিটি ব্যবহার করতে ইচ্ছুক এবং সক্ষম?

একবার এই চারটি প্রশ্নের উত্তর দেওয়া হয়ে গেলে, আপনার লক্ষ্যগুলি পূরণের জন্য জাভাস্ক্রিপ্টে মূলত "সম্পত্তি অপসারণ" এর চারটি বিভাগ বেছে নেওয়া হয়েছে। তারা হ'ল:

মিউটিটিভ অবজেক্ট সম্পত্তি মোছা, অনিরাপদ

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

'use strict'
const iLikeMutatingStuffDontI = { myNameIs: 'KIDDDDD!', [Symbol.for('amICool')]: true }
delete iLikeMutatingStuffDontI[Symbol.for('amICool')] // true
Object.defineProperty({ myNameIs: 'KIDDDDD!', 'amICool', { value: true, configurable: false })
delete iLikeMutatingStuffDontI['amICool'] // throws

এই বিভাগটি সম্পত্তি অপসারণের প্রাচীনতম, সর্বাধিক সোজাসাপ্টা এবং সর্বাধিক বহুল সমর্থিত বিভাগ। এটি Symbolস্ট্রিং ছাড়াও অ্যারে সূচকগুলিকে সমর্থন করে এবং প্রথম প্রথম প্রকাশ ব্যতীত জাভাস্ক্রিপ্টের প্রতিটি সংস্করণে কাজ করে। তবে, এটি পরিবর্তনশীল যা কিছু প্রোগ্রামিং নীতি লঙ্ঘন করে এবং এতে কার্য সম্পাদন সংক্রান্ত প্রভাব পড়ে। কড়া মোডে অ-কনফিগারযোগ্য বৈশিষ্ট্যগুলিতে ব্যবহার করার সময় এটি অপ্রকাশিত ব্যতিক্রমগুলির ফলাফলও হতে পারে ।

বিশ্রাম ভিত্তিক স্ট্রিংয়ের সম্পত্তি বাদ দেওয়া

এই বিভাগটি নতুন ECMAScript স্বাদে প্লেইন অবজেক্ট বা অ্যারের উদাহরণগুলিতে অপারেটিংয়ের জন্য যখন কোনও অ-পরিবর্তনীয় পদ্ধতির পছন্দ হয় এবং আপনাকে সিম্বল কীগুলির জন্য অ্যাকাউন্ট করতে হবে না:

const foo = { name: 'KIDDDDD!', [Symbol.for('isCool')]: true }
const { name, ...coolio } = foo // coolio doesn't have "name"
const { isCool, ...coolio2 } = foo // coolio2 has everything from `foo` because `isCool` doesn't account for Symbols :(

মিউটিটিভ অবজেক্ট সম্পত্তি মুছে ফেলা, নিরাপদ

এই বিভাগটি অবজেক্ট ল্যাটারাল বা অবজেক্টের উদাহরণগুলিতে অপারেটিং করার জন্য যখন আপনি অক্ষম বৈশিষ্ট্যগুলিতে নিক্ষিপ্ত ব্যতিক্রমগুলি থেকে রক্ষা করার সময় মূল রেফারেন্সটি ধরে রাখতে / চালিয়ে যেতে চান:

'use strict'
const iLikeMutatingStuffDontI = { myNameIs: 'KIDDDDD!', [Symbol.for('amICool')]: true }
Reflect.deleteProperty(iLikeMutatingStuffDontI, Symbol.for('amICool')) // true
Object.defineProperty({ myNameIs: 'KIDDDDD!', 'amICool', { value: true, configurable: false })
Reflect.deleteProperty(iLikeMutatingStuffDontI, 'amICool') // false

তদতিরিক্ত, স্থানে বস্তুগুলিকে স্থানান্তরিত করা রাষ্ট্রবিহীন নয়, আপনি Reflect.deletePropertyআংশিক প্রয়োগ এবং অন্যান্য কার্যকরী কৌশলগুলি করতে পারেন যা deleteবিবৃতি দিয়ে সম্ভব নয় ।

সিনট্যাক্স ভিত্তিক স্ট্রিংয়ের সম্পত্তি বাদ দেওয়া

এই বিভাগটি নতুন ECMAScript স্বাদে প্লেইন অবজেক্ট বা অ্যারের উদাহরণগুলিতে অপারেটিংয়ের জন্য যখন কোনও অ-পরিবর্তনীয় পদ্ধতির পছন্দ হয় এবং আপনাকে সিম্বল কীগুলির জন্য অ্যাকাউন্ট করতে হবে না:

const foo = { name: 'KIDDDDD!', [Symbol.for('isCool')]: true }
const { name, ...coolio } = foo // coolio doesn't have "name"
const { isCool, ...coolio2 } = foo // coolio2 has everything from `foo` because `isCool` doesn't account for Symbols :(

গ্রন্থাগার-ভিত্তিক সম্পত্তি বাদ দেওয়া

এই বিভাগটি সাধারণত প্রতীকগুলির জন্য অ্যাকাউন্টিং এবং এক বিবৃতিতে একাধিক সম্পত্তি বাদ দেওয়া সহ বৃহত্তর কার্যকরী নমনীয়তার জন্য অনুমতি দেয়:

const o = require("lodash.omit")
const foo = { [Symbol.for('a')]: 'abc', b: 'b', c: 'c' }
const bar = o(foo, 'a') // "'a' undefined"
const baz = o(foo, [ Symbol.for('a'), 'b' ]) // Symbol supported, more than one prop at a time, "Symbol.for('a') undefined"

var keyname = "কীনাম"; মাইঅবজেক্ট [কী নাম] মুছুন;
বিকাশ চৌহান

7

const myObject = {
        "ircEvent": "PRIVMSG",
        "method": "newURI",
        "regex": "^http://.*"
    };

const { regex, ...other } = myObject;

console.log(myObject)
console.log(regex)
console.log(other)


@ কোডড্র্যাঞ্চ দুঃখিত, আমি উত্তরটি দেখে মনোযোগ দিই নি। আমি তা দেখার সাথে সাথে এর উত্তর delete myObject.regex;
জিয়াং

7

আপনি রেস্ট অপারেটরের সাথে ES6 ডেস্ট্রাকচারিং ব্যবহার করতে পারেন।

বিশ্রাম অপারেটরের সাথে মিশ্রণে বৈশিষ্ট্যগুলি ডেস্ট্রাকচারিং ব্যবহার করে সরানো যেতে পারে । আপনার উদাহরণে রেজেক্সটি ডিস্ট্রাক্ট করা হয়েছে (উপেক্ষা করা) এবং বাকি বৈশিষ্ট্যগুলি বিশ্রাম হিসাবে ফিরিয়ে দেওয়া হয়েছে।

const noRegex = ({ regex, ...rest }) => rest;
const myObject = {
  "ircEvent": "PRIVMSG",
  "method": "newURI",
  "regex": "^http://.*"
};

console.log(noRegex(myObjext)) //=> {  "ircEvent": "PRIVMSG","method": "newURI" }

অথবা আপনি এই জাতীয় বৈশিষ্ট্যকে গতিশীলভাবে বাদ দিতে পারেন,

const myObject = {
  "ircEvent": "PRIVMSG",
  "method": "newURI",
  "regex": "^http://.*"
};
const removeProperty = prop => ({ [prop]: _, ...rest }) => rest

const removeRegex = removeProperty('regex') //=> {  "ircEvent": "PRIVMSG","method":"newURI" }
const removeMethod = removeProperty('method') //=> {  "ircEvent": "PRIVMSG", "regex":"^http://.*" }

7

আমরা নিম্নলিখিত ব্যবহার করে জাভাস্ক্রিপ্ট অবজেক্ট থেকে যে কোনও সম্পত্তি মুছে ফেলতে পারি:

  1. অবজেক্ট.প্রপার্টি মুছুন
  2. বস্তু ['সম্পত্তি'] মুছুন

উদাহরণ:

var myObject = {
    "ircEvent": "PRIVMSG",
    "method": "newURI",
    "regex": "^http://.*"
};

console.log(myObject);

delete myObject.regex;
console.log('=================');
console.log(myObject);
delete myObject['method'];
console.log('=================');
console.log(myObject);


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.