सरणी में सभी ऑब्जेक्ट्स के लिए गुण निकालें


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, या कुछ और। मुझे नहीं पता। विचार?


1
कोई फर्क नहीं पड़ता, अन्य तरीके किसी भी कम तो रैखिक हे (एन) नहीं मिल सकता है। आप जो भी उपयोग करते हैं, उसे आपके सभी सरणी तत्वों
ब्रायन

प्रोटोटाइप? वह कैसे मदद करेगा? या क्या वे सभी वस्तुएं एक ही निर्माता के उदाहरण हैं और किसके लिए एक साझा मूल्य है bad?
बरगी

1
@Bergi मुझे आश्चर्य है कि अगर वे प्रोटोटाइप प्रोटोटाइप, या प्रोटोटाइप का जिक्र कर रहे हैं Array, जो कि डिस्ट्रो का उदाहरण है
इयान

मुझे यकीन नहीं है कि आप looping से पहले एक चर में array.length स्टोर करना चाहिए। मुझे यकीन है कि यदि आप प्रोफ़ाइल करते हैं तो आप देखेंगे कि यह दर्द के लायक नहीं है।
सेज्यूरेट

1
@ZackArgyle हां, सामान्य मामले में कुछ भी तेज नहीं है।
डेविस सेगुरेट

जवाबों:


120

केवल अन्य तरीके कॉस्मेटिक हैं और वास्तव में लूप हैं।

उदाहरण के लिए :

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

टिप्पणियाँ:

  • यदि आप IE8 के साथ संगत होना चाहते हैं, तो आपको forEach के लिए एक शिम की आवश्यकता होगी । जैसा कि आप प्रोटोटाइप का उल्लेख करते हैं, प्रोटोटाइप.जेएस में एक शिम भी है
  • deleteसबसे खराब "अनुकूलन हत्यारों" में से एक है । इसका उपयोग करने से अक्सर आपके अनुप्रयोगों का प्रदर्शन टूट जाता है। यदि आप वास्तव में किसी संपत्ति को हटाना चाहते हैं तो आप इसे टाल नहीं सकते हैं लेकिन आप अक्सर संपत्ति को undefinedया तो सेट कर सकते हैं या संपत्ति के बिना नई वस्तुओं का निर्माण कर सकते हैं।

1
लूप की तुलना में बेहतर नहीं है अगर लूप को "नकली" होने की अनुमति दी गई है, तो भी पंक्तिबद्ध: पीfor(var i = 0; i < array.length ) delete array[i].bad
एस्लेइजा

1
@Esailija निर्भर करता है। मुझे उपयोग करना पसंद है forEachक्योंकि मुझे कोड अधिक अभिव्यंजक लगता है (और क्योंकि मैंने बहुत समय पहले IE के बारे में चिंता करना बंद कर दिया था)।
डेसीस सेगुरेट

1
उनमें से कोई भी "इस सरणी में सभी वस्तुओं की बुरी संपत्ति को नष्ट नहीं करता है" को मौलिक रूप से अलग तरीके से व्यक्त करता है। forEachएक forपाश की तरह ही सामान्य और शब्दार्थ से अर्थहीन है ।
एस्लेइजा

1
@Esailija मैं सहमत हूँ। इसलिए मैंने इसे "कॉस्मेटिक" बना दिया। क्या यह मेरे उत्तर में स्पष्ट नहीं है?
डेविस सेगुरेट

दुर्भाग्य। मैं लूप के लिए छड़ी करूँगा जो आम तौर पर फॉरच की तुलना में तेज़ होता है। और वास्तव में ... जो IE8 के बारे में परवाह करता है। सहायता के लिए धन्यवाद।
ज़ैक आर्गिएल

174

ES6 के साथ, आप प्रत्येक ऑब्जेक्ट का नाम विशेषताओं के बिना नया बनाने के लिए विघटित कर सकते हैं:

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

16
प्रारंभिक समस्या के लिए यह लागू हो सकता हैconst newArray = array.map(({ bad, ...item }) => item);
dhilt

1
यह बहुत अनुशंसित है क्योंकि यह मूल सरणी (अपरिवर्तनीय संचालन) को संशोधित नहीं करता है
Pizzicato

1
यह स्वीकृत उत्तर होना चाहिए क्योंकि यह मौजूदा सरणी को अधिलेखित करने के बजाय एक नया सरणी देता है।
user1275105

शानदार उत्तर लेकिन अगर संपत्ति के नाम में डॉट (।) शामिल नहीं है, तो 'खराब.प्रॉप'
ययाति

@Amiraslan मैं इस्तेमाल // eslint-disable-next-line no-unused-vars
करूंगा

21

मैं संपत्ति को हटाने के लिए मानचित्र का उपयोग करना पसंद करता हूं और फिर नई सरणी आइटम वापस करता हूं।

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

12
ज्ञात हो कि यह मूल सरणी
piotr_cz

1
इस विशेष मामले में स्पष्ट 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}))

3
सवाल अच्छे को दूर करने का था, अच्छे को रखने का नहीं था। यदि आपकी वस्तुओं को रखने के लिए 10 फ़ील्ड हैं और हटाने के लिए एक है, तो ऊपर टाइप करने के लिए वास्तव में लंबा हो जाता है।
एड्रियन

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

मैंने Vue.js. में युग्मनों को हटाने के बिना एक नई वस्तु को पाने की कोशिश की है

let data =this.selectedContactsDto[];

// selectContactsDto [] = मेरी परियोजना में बनाई गई सरणी वस्तुओं की सूची के साथ वस्तु

console.log (डेटा); चलो newDataObj = data.map (({groupList, customFields, firstname, ... item}) = = आइटम); console.log ( "newDataObj", newDataObj);


0

कुछ प्रमुख मूल्य जोड़ी फॉर्म ऑब्जेक्ट सरणी को हटाने के लिए इस उदाहरण की तरह डेटाबेस के रूप में Postgres SQL का उपयोग करता है :

यह उपयोगकर्ता फ़ंक्शन रिटर्न उपयोगकर्ता विवरण ऑब्जेक्ट है, हमें पंक्तियों से "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 प्रतिक्रिया से पहले ऑब्जेक्ट के नीचे लौटाता है

 {
    "_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

ईएस 6 में सबसे छोटा तरीका:

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

0

वहाँ बहुत सारे पुस्तकालय हैं। यह सब इस बात पर निर्भर करता है कि आपकी डेटा संरचना कितनी जटिल है (उदाहरण के लिए नेस्टेड कीज़ पर विचार करें)

हमें ऑब्जेक्ट-फ़ील्ड पसंद हैं क्योंकि यह गहरी नेस्टेड पदानुक्रमों (एपीआई फ़ील्ड पैरामीटर के लिए निर्माण) के साथ भी काम करता है। ऑब्जेक्ट-स्कैन पर आधारित है , इसलिए आप जानते हैं कि यह तेज़ है। यहाँ एक सरल कोड उदाहरण है

const { Retainer } = require('object-fields');

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

const prune = Retainer(['good']);
prune(array);
console.log(array);
// => [ { good: 'something' }, { good: 'something' } ]

-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));


क्या आप अपना समाधान बता सकते हैं?
22

जावास्क्रिप्ट ईएस 6 में मानचित्र एक नई डेटा संरचना है। संलग्न लिंक आपकी मदद कर सकता है। hackernoon.com/what-you-should-know-about-es6-maps-dc66af6b9a1e
hk_y

यह समाधान अच्छा नहीं है यदि आपके पास अपने आइटम में कई प्रॉपर हैं।
कोप 4

हाँ! एक अलग दृष्टिकोण प्रदान करने की कोशिश की।
hk_y
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.