অ্যারেতে সমস্ত বস্তুর জন্য সম্পত্তি সরান


111

আমি badঅ্যারের প্রতিটি বস্তু থেকে সম্পত্তি সরিয়ে নিতে চাই । একটি forলুপ ব্যবহার এবং এটি প্রতিটি বস্তু থেকে মুছে ফেলার চেয়ে কি আরও ভাল উপায় আছে ?

var array = [{"bad": "something", "good":"something"},{"bad":"something", "good":"something"},...];

for (var i = 0, len = array.length; i < len; i++) {
  delete array[i].bad;
}

দেখে মনে হচ্ছে ব্যবহার করার কোনও উপায় prototypeবা কিছু থাকা উচিত। আমি জানি না। ধারনা?


4
কিছু যায় আসে না, অন্যান্য উপায়গুলি লিনিয়ার হে (এন) এর চেয়ে কম কিছু পেতে পারে না। আপনি যা কিছু ব্যবহার করুন না কেন, আপনার সমস্ত অ্যারে উপাদানগুলির অ্যাক্সেসের প্রয়োজন হবে
ব্রায়ান

প্রোটোটাইপ? কীভাবে সাহায্য করবে? বা const সমস্ত বস্তুগুলি একই নির্মাতার উদাহরণস্বরূপ এবং একটি সাধারণ মূল্য ভাগ করে নিচ্ছে bad?
বার্গি

4
@ বেরগি আমি অবাক হয়েছি তারা প্রোটোটাইপজেএস, বা প্রোটোটাইপের কথা উল্লেখ করছিল Array, যা উদাহরণস্বরূপ ডাইস্ট্র্রয় করে
ইয়ান

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

4
@ জ্যাকআরিগল হ্যাঁ, সাধারণ ক্ষেত্রে এর চেয়ে দ্রুত আর কিছুই নেই।
অস্বীকার করেছেন সাগুরেট

উত্তর:


120

কেবলমাত্র অন্য উপায়গুলি প্রসাধনী এবং আসলে লুপগুলি।

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

array.forEach(function(v){ delete v.bad });

মন্তব্য:

  • আপনি যদি আইই 8 এর সাথে সামঞ্জস্য রাখতে চান তবে আপনার জন্য প্রতিটি শিমের দরকার । আপনি যেমন প্রোটোটাইপ উল্লেখ করেছেন , প্রোটোটাইপ.জেএস এও শিম আছে
  • deleteহ'ল সবচেয়ে খারাপ "অপটিমাইজেশন কিলার" । এটি ব্যবহার করা আপনার অ্যাপ্লিকেশনগুলির পারফরম্যান্স প্রায়শই ভেঙে দেয়। আপনি যদি সত্যিই কোনও সম্পত্তি মুছে ফেলতে চান তবে আপনি এড়াতে পারবেন না তবে আপনি প্রায়শই সম্পত্তিটি সেট করতে পারেন undefinedবা সম্পত্তি ব্যতীত কেবল নতুন অবজেক্ট তৈরি করতে পারেন ।

4
লুপটিকে "জাল" for(var i = 0; i < array.length ) delete array[i].bad
-রকমও

4
@ এসাইলিজা নির্ভর করে। আমি ব্যবহার করতে পছন্দ করি forEachকারণ আমি কোডটি আরও সংবেদনশীল খুঁজে পাই (এবং কারণ আমি দীর্ঘকাল আগে IE সম্পর্কে চিন্তাভাবনা বন্ধ করে দিয়েছি)।
অস্বীকার করেছেন সাগুরেট

4
তাদের উভয়ই "এই অ্যারেতে সমস্ত বস্তুর খারাপ সম্পত্তি মুছুন" প্রকাশ করেন না একেবারে ভিন্ন উপায়ে। লুপের forEachমতো জেনেরিক এবং শব্দার্থগত অর্থহীন for
ইসাইলিজা

4
@ ইসাইলিজা আমি সম্মত সে কারণেই আমি সংশোধন করেছি এটি "প্রসাধনী"। আমার উত্তরে কি তা পরিষ্কার নয়?
সাগ্ররেটকে অস্বীকার করেছেন

দুর্ভাগ্যজনক। আমি ফর লুপটি আটকে যা সাধারণত ফোরের চেয়ে দ্রুততর হয়। এবং সত্যিই ... কে আই 8 সম্পর্কে চিন্তা করে। সাহায্যের জন্য ধন্যবাদ.
জ্যাক আরজিলে

173

ES6 এর সাহায্যে, আপনি প্রতিটি বস্তুকে নামযুক্ত বৈশিষ্ট্য ছাড়াই নতুন তৈরি করতে ডিকনস্ট্রাক্ট করতে পারেন:

const newArray = array.map(({dropAttr1, dropAttr2, ...keepAttrs}) => keepAttrs)

16
প্রাথমিক সমস্যাটিতে প্রয়োগ করা এটি হতে পারেconst newArray = array.map(({ bad, ...item }) => item);
ধীরে ধীরে

4
এটি খুব সুপারিশ করা হয় যেহেতু এটি মূল অ্যারে (পরিবর্তনযোগ্য ক্রিয়াকলাপগুলি) পরিবর্তন করে না
পিজনিকাটো

4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত কারণ এটি বিদ্যমান উত্তরটি লেখার পরিবর্তে একটি নতুন অ্যারে প্রদান করে।
ব্যবহারকারী 1275105

মহান উত্তর কিন্তু কাজ সম্পত্তি নাম ডট থাকে যথা, 'bad.prop' (।)
Yayati

@ আমিরস্লান আমি ব্যবহার করব// eslint-disable-next-line no-unused-vars
পাইওত্রে_সিজেড

20

আমি সম্পত্তিটি মুছতে এবং তারপরে নতুন অ্যারে আইটেমটি ফিরিয়ে দিতে মানচিত্রটি ব্যবহার করতে পছন্দ করি।

array.map(function(item) { 
    delete item.bad; 
    return item; 
});

12
সচেতন হন যে এই আসল অ্যারেটি পরিবর্তন করে
piotr_cz

4
এই বিশেষ ক্ষেত্রে সুস্পষ্ট returnবিবৃতি প্রয়োজন হবে না
সন্দীপ কুমার

4
array.forEach(v => delete v.bad);
অ্যান্টনি আউলি


9

প্রোটোটাইপ ব্যবহার করে একটি সমাধান কেবল তখনই সম্ভব যখন আপনার বস্তুগুলি সমান হয়:

function Cons(g) { this.good = g; }
Cons.prototype.bad = "something common";
var array = [new Cons("something 1"), new Cons("something 2"), …];

তবে তারপরে এটি সহজ (এবং O(1)):

delete Cons.prototype.bad;

3

আমার মতে এটি সহজতম বৈকল্পিক

array.map(({good}) => ({good}))

4
প্রশ্নটি খারাপটি সরিয়ে রাখার বিষয়ে ছিল, ভাল রাখেনি। যদি আপনার অবজেক্টগুলিতে রাখার জন্য 10 টি ক্ষেত্র এবং একটি অপসারণ করতে থাকে তবে উপরেরটি টাইপ করতে সত্যিই দীর্ঘ হয়ে যায় long
অ্যাড্রাইন

1

আপনি এটি অনুসরণ করতে পারেন, আরও পাঠযোগ্য, কীটি পাওয়া যায়নি বলে প্রত্যাশা বাড়ানো যায় না:

data.map((datum)=>{
                    return {
                        'id':datum.id,
                        'title':datum.login,
                    }

0

আমি Object.assignএকটি forEach()লুপের মধ্যে ব্যবহার করার পরামর্শ দেব যাতে জিনিসগুলি অনুলিপি করা হয় এবং বস্তুর মূল অ্যারেটিকে প্রভাবিত না করে

var res = [];
array.forEach(function(item) { 
    var tempItem = Object.assign({}, item);
    delete tempItem.bad; 
    res.push(tempItem);
});
console.log(res);

0

এই প্রশ্নটি এখন কিছুটা পুরানো, তবে আমি একটি বিকল্প সমাধান দিতে চাই যা উত্সের ডেটাটি রূপান্তরিত করে না এবং এর জন্য ন্যূনতম ম্যানুয়াল প্রচেষ্টা প্রয়োজন:

function mapOut(sourceObject, removeKeys = []) {
  const sourceKeys = Object.keys(sourceObject);
  const returnKeys = sourceKeys.filter(k => !removeKeys.includes(k));
  let returnObject = {};
  returnKeys.forEach(k => {
    returnObject[k] = sourceObject[k];
  });
  return returnObject;
}

const array = [
  {"bad": "something", "good":"something"},
  {"bad":"something", "good":"something"},
];

const newArray = array.map(obj => mapOut(obj, [ "bad", ]));

এটি নিখুঁত থেকে কিছুটা কম তবে এটি অপরিবর্তনের কিছু স্তর বজায় রাখে এবং আপনি মুছে ফেলতে চান এমন একাধিক বৈশিষ্ট্যের নামকরণের নমনীয়তা রয়েছে। (পরামর্শ স্বাগত)


0

আমি ভয়ে.জেএস-এর কুলমনগুলি মোছা না করে একটি নতুন অবজেক্ট তৈরি করার চেষ্টা করেছি

let data =this.selectedContactsDto[];

// UsedContactsDto [] = আমার প্রকল্পে তৈরি অ্যারে অবজেক্টগুলির তালিকা সহ অবজেক্ট

কনসোল.লগ (ডেটা); newDataObj = ডেটা.ম্যাপ (({গ্রুপলিস্ট, কাস্টমফিল্ডস, প্রথম নাম, ... আইটেম}) => আইটেম)) দিন; কনসোল.লগ ("newDataObj", newDataObj);


0

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

এটি ব্যবহারকারীর বিবরণ ব্যবহারকারী বিবরণ অবজেক্ট, আমাদের সারিগুলি থেকে "api_secret" কী মুছে ফেলতে হবে:

    function getCurrentUser(req, res, next) { // user function
    var userId = res.locals.userId;
    console.log(userId)
    db.runSQLWithParams("select * from users where id = $1", [userId], function(err, rows) {
      if(err){
        console.log(err)
      }
      var responseObject = {
        _embedded: rows,
      }
      responseObject._embedded[0].api_secret = undefined
      // console.log(api);
      // console.log(responseObject);
      res.json(responseObject);
    }); 
}

উপরের ফাংশনটি JSON প্রতিক্রিয়া হিসাবে বস্তুর নীচে ফিরে আসে return

 {
    "_embedded": [
        {
            "id": "0123abd-345gfhgjf-dajd4456kkdj",
            "secret_key: "secret",
            "email": "abcd@email.com",
            "created": "2020-08-18T00:13:16.077Z"
        }
    ]
}

এই লাইনটি যুক্ত করার পরে responseObject._embedded[0].api_secret = undefinedএটি JSON প্রতিক্রিয়া হিসাবে নীচে ফলাফল দেয়:

{
        "_embedded": [
            {
                "id": "0123abd-345gfhgjf-dajd4456kkdj",
                "email": "abcd@email.com",
                "created": "2020-08-18T00:13:16.077Z"
            }
        ]
    }

0

ES6 এর সবচেয়ে সংক্ষিপ্ততম উপায়:

array.forEach(e => {delete e.someKey});

-4

var array = [{"bad": "something", "good":"something"},{"bad":"something", "good":"something"}];
var results = array.map(function(item){
  return {good : item["good"]}
});
console.log(JSON.stringify(results));


আপনি কি আপনার সমাধান ব্যাখ্যা করতে পারেন?
স্যাজি 7

জাভা স্ক্রিপ্ট ES6 এ মানচিত্রটি একটি নতুন ডেটা কাঠামো। সংযুক্ত লিঙ্কটি আপনাকে সহায়তা করতে পারে। হ্যাকারুন.ইউইটিউইউ- শল্ড
জ্ঞান-সম্পর্কে-

আপনার আইটেমগুলিতে অনেক প্রপস থাকলে এই সমাধানটি ভাল নয়।
Koop4

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