जाँच करें कि क्या ऑब्जेक्ट ऑब्जेक्ट्स के जावास्क्रिप्ट ऐरे के भीतर मौजूद है और नहीं तो ऐरे से नई ऑब्जेक्ट जोड़ें


147

यदि मेरे पास वस्तुओं की निम्न सरणी है:

[ { id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 2, username: 'ted' } ]

क्या सरणी के माध्यम से यह जांचने के लिए कि क्या कोई विशेष उपयोगकर्ता नाम पहले से मौजूद है और यदि वह कुछ भी नहीं करता है, तो यह जाँचने के लिए एक तरीका है, लेकिन अगर यह उपयोगकर्ता नाम (और नई आईडी) के साथ सरणी में एक नई वस्तु नहीं जोड़ता है?

धन्यवाद!


1
क्या बिल और टेड में एक ही आईडी होनी चाहिए?
user2357112

एक ही के साथ दो तत्व क्यों हैं id? क्या यह संभव है कि तत्वों को इस सरणी से हटा दिया जाएगा, या क्या हम सुनिश्चित कर सकते हैं कि नया तत्व हमेशा idबराबर होगा arr.length + 1?
वर्षा।।

यदि आप इसके माध्यम से लूप नहीं करना चाहते हैं, तो सरणी के प्रोटोटाइप, stackoverflow.com/questions/1988349/… के विस्तार के लिए इस प्रश्नोत्तर को देखें ।
Cem Czer

देशी कार्य सामान्य छोरों की तुलना में धीमे होते हैं और उनका समर्थन कुछ ब्राउज़र संस्करणों तक सीमित होता है। नीचे मेरे जवाब की जाँच करें।
ज़ाहेन

यह एक मौलिक रूप से गलत सवाल है क्योंकि आप एरे के उपयोग से बचकर ऐसा कर सकते हैं।
बेकिम बकाज

जवाबों:


234

मैंने मान लिया है कि idयहाँ अद्वितीय होने का मतलब है। someसरणियों में चीजों के अस्तित्व की जाँच करने के लिए एक महान कार्य है:

const arr = [{ id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 3, username: 'ted' }];

function add(arr, name) {
  const { length } = arr;
  const id = length + 1;
  const found = arr.some(el => el.username === name);
  if (!found) arr.push({ id, username: name });
  return arr;
}

console.log(add(arr, 'ted'));


1
धन्यवाद एंडी यह समस्या का एक बहुत ही साफ समाधान है और बहुत अच्छी तरह से काम कर रहा है। मैं पहले किसी विधि के पार नहीं आया था। आपकी धारणा सही थी कि मेरा आईडी उदाहरण सिर्फ एक टाइपो था, मैं आईडी निर्धारित करने के लिए arr.length + 1 का उपयोग कर रहा था।
user2576960

3
सावधान रहें कि IE8 और पहले कुछ फ़ंक्शन का समर्थन नहीं करते हैं।
BetaRide

क्या पाया गया फ़ंक्शन एक IF में बनाया जा सकता है? कुछ इस तरह से: if (arr.some (फ़ंक्शन (el) {el.Id == कुछId) और यह या तो सही या गलत वापस आ जाएगा यदि यह मौजूद है या नहीं?
stibay

@stibay, एक बूलियन वापस some करता हैfoundया तो होगा trueया falseकॉलबैक की शर्त पूरी होती है या नहीं, इस पर निर्भर करता है।
एंडी

1
ओह, निश्चित if (arr.some(function (el) { return el.Id == someId; })) { // do something }:। यह मत भूलो returnया आपको कुछ भी वापस नहीं मिलेगा।
एंडी

26

मौजूदा उपयोगकर्ता नाम की जांच करना मामूली है:

var arr = [{ id: 1, username: 'fred' }, 
  { id: 2, username: 'bill'}, 
  { id: 3, username: 'ted' }];

function userExists(username) {
  return arr.some(function(el) {
    return el.username === username;
  }); 
}

console.log(userExists('fred')); // true
console.log(userExists('bred')); // false

लेकिन यह स्पष्ट नहीं है कि इस सरणी में एक नया उपयोगकर्ता जोड़ने के लिए आपको क्या करना है। सबसे आसान तरीका - बस एक नए तत्व को idबराबर के साथ धकेलना array.length + 1:

function addUser(username) {
  if (userExists(username)) {
    return false; 
  }
  arr.push({ id: arr.length + 1, username: username });
  return true;
}

addUser('fred'); // false
addUser('bred'); // true, user `bred` added

यह आईडी की विशिष्टता की गारंटी देगा, लेकिन इस सरणी को थोड़ा अजीब लगेगा यदि कुछ तत्वों को इसके अंत से हटा दिया जाएगा।


इसके लिए धन्यवाद। मैं अंत में एंडी के समाधान के साथ गया क्योंकि यह एक ही बात को प्राप्त करने का एक अधिक सफल तरीका है। मैं किसी भी बिंदु पर उपयोगकर्ताओं को नहीं हटा रहा हूं इसलिए आईडी संगत रहना चाहिए। चेक उपयोगकर्ताओं को ओवरटाइम बढ़ने वाले सरणी के बिना फिर से अंदर और बाहर लॉग इन करने की अनुमति देता है। बस जानकारी के लिए मैं इस फ़ंक्शन का उपयोग passport.js के साथ मिलकर कर रहा हूं और मैं उपयोगकर्ताओं को पासपोर्ट कोड के साथ खेलने के बिना सरणी से उपयोगकर्ताओं को हटाने का एक तरीका खोजने में सक्षम नहीं हूं। यह समाधान अच्छी तरह से काम करता है।
user2576960

18

यह छोटा सा स्निपेट मेरे लिए काम करता है ।।

const arrayOfObject = [{ id: 1, name: 'john' }, {id: 2, name: 'max'}];

const checkUsername = obj => obj.name === 'max';

console.log(arrayOfObject.some(checkUsername))

1
बल्कि सुरुचिपूर्ण दृष्टिकोण! - अधिक विवरण और उदाहरण .someयहां पाए गए हैं - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
जेम्स मैरिनो

10

मुझे लगता है कि, यह इस समस्या को दूर करने का सबसे छोटा तरीका है। यहां मैंने नए जोड़ने वाले उपयोगकर्ता नाम के अस्तित्व की जांच करने के लिए .filter के साथ ES6 तीर फ़ंक्शन का उपयोग किया है।

var arr = [{
    id: 1,
    username: 'fred'
}, {
    id: 2,
    username: 'bill'
}, {
    id: 3,
    username: 'ted'
}];

function add(name) {
    var id = arr.length + 1;        
            if (arr.filter(item=> item.username == name).length == 0){
            arr.push({ id: id, username: name });
        }
}

add('ted');
console.log(arr);

फिडल से लिंक


3

यह मैंने @ सागर-गावणे के उत्तर के अलावा किया है

const newUser = {_id: 4, name: 'Adam'}
const users = [{_id: 1, name: 'Fred'}, {_id: 2, name: 'Ted'}, {_id: 3, 'Bill'}]

const userExists = users.some(user => user.name = newUser.name);
if(userExists) {
    return new Error({error:'User exists'})
}
users.push(newUser)

नमस्ते, अगर मुझे मूल्य मिला तो मैं आईडी का उपयोग कैसे कर सकता हूं?
कुसुम किठमल

यह वास्तव में करने के लिए सरल है... if(userExists) { const userId = userExists.id return userId; } ...
माइकल Enitan

2

स्वीकृत जवाब को .some पर एरो फंक्शन का उपयोग करके निम्नलिखित तरीके से भी लिखा जा सकता है

 function checkAndAdd(name) {
     var id = arr.length + 1;
     var found = arr.some((el) => {
           return el.username === name;
     });
     if (!found) { arr.push({ id: id, username: name }); }
 }

2

यहाँ एक ES6 विधि श्रृंखला का उपयोग किया गया है .map()और .includes():

const arr = [ { id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 2, username: 'ted' } ]

const checkForUser = (newUsername) => {
      arr.map(user => {
        return user.username
      }).includes(newUsername)
    }

if (!checkForUser('fred')){
  // add fred
}
  1. उपयोगकर्ता नाम पर स्ट्रिंग उपयोगकर्ता नाम की स्ट्रिंग बनाने के लिए।
  2. जाँचें कि क्या उपयोगकर्ता नाम के सरणी में नया उपयोगकर्ता नाम शामिल है
  3. यदि यह मौजूद नहीं है, तो नया उपयोगकर्ता जोड़ें

1

मुझे एंडी का जवाब पसंद है, लेकिन आईडी जरूरी नहीं है कि यह अद्वितीय हो, इसलिए यहां एक विशिष्ट आईडी बनाने के लिए मैं आया हूं। Jsfiddle पर भी जांच की जा सकती है । कृपया ध्यान दें कि arr.length + 1बहुत अच्छी तरह से एक अद्वितीय आईडी की गारंटी नहीं दे सकता है अगर कुछ भी पहले हटा दिया गया था।

var array = [ { id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 3, username: 'ted' } ];
var usedname = 'bill';
var newname = 'sam';

// don't add used name
console.log('before usedname: ' + JSON.stringify(array));
tryAdd(usedname, array);
console.log('before newname: ' + JSON.stringify(array));
tryAdd(newname, array);
console.log('after newname: ' + JSON.stringify(array));

function tryAdd(name, array) {
    var found = false;
    var i = 0;
    var maxId = 1;
    for (i in array) {
        // Check max id
        if (maxId <= array[i].id)
            maxId = array[i].id + 1;

        // Don't need to add if we find it
        if (array[i].username === name)
            found = true;
    }

    if (!found)
        array[++i] = { id: maxId, username: name };
}

मुझे अन्य उत्तरों में सादगी पसंद है, मैंने सिर्फ यूनिक आईडी के लिए चेक जोड़ने के लिए मेरा पोस्ट किया
Uxonith

आपके उत्तर के लिए धन्यवाद Uxonith फिलहाल मुझे यूनिक आईडी की आवश्यकता नहीं है क्योंकि मैं उपयोगकर्ताओं को सरणी से नहीं हटाऊंगा। अगर जरूरत पड़ी तो मैं इस प्रस्ताव को अपनी पिछली जेब में रखूंगा। धन्यवाद फिर से
user2576960

1

आप इसे और अधिक मॉड्यूलर बनाने के लिए अपने सरणी को प्रोटोटाइप कर सकते हैं, कुछ इस तरह का प्रयास करें

    Array.prototype.hasElement = function(element) {
        var i;
        for (i = 0; i < this.length; i++) {
            if (this[i] === element) {
                return i; //Returns element position, so it exists
            }
        }

        return -1; //The element isn't in your array
    };

और आप इसका उपयोग कर सकते हैं:

 yourArray.hasElement(yourArrayElement)

1

मैंने किसी कारण से उपरोक्त चरणों की कोशिश की, यह मेरे लिए काम नहीं करता है, लेकिन यह मेरी अपनी समस्या का अंतिम समाधान था, शायद इसे पढ़ने वाले किसी भी व्यक्ति के लिए उपयोगी हो:

let pst = post.likes.some( (like) => {  //console.log(like.user, req.user.id);
                                     if(like.user.toString() === req.user.id.toString()){
                                         return true
                                     } } )

यहाँ post.likes उन उपयोगकर्ताओं की एक सरणी है जिन्हें एक पोस्ट पसंद है।


1

इसे इस्तेमाल करे

पहली विधि कुछ का उपयोग कर

  let arr = [{ id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 3, username: 'ted' }];
    let found = arr.some(ele => ele.username === 'bill');
    console.log(found)

दूसरी विधि का उपयोग शामिल है, नक्शा

   let arr = [{ id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 3, username: 'ted' }];
    let mapped = arr.map(ele => ele.username);
    let found = mapped.includes('bill');
    console.log(found)

क्या होगा यदि मैं वस्तुओं को 2 विशेषताओं जैसे {"नाम": "टेस्ट 1", "आयु": 30} से तुलना करना चाहता हूं?
प्रोबेटेलल

1

मान लेते हैं कि हमारे पास वस्तुओं की एक सरणी है और आप जांचना चाहते हैं कि क्या नाम का मूल्य इस तरह परिभाषित किया गया है,

let persons = [ {"name" : "test1"},{"name": "test2"}];

if(persons.some(person => person.name == 'test1')) {
    ... here your code in case person.name is defined and available
}

कृपया यह बताने के लिए कुछ वाक्यों को जोड़ें कि आपका कोड क्या कर रहा है, इसलिए आप अपने उत्तर के लिए और अधिक अपडेट प्राप्त कर सकते हैं।
फजी एनालिसिस

क्या होगा अगर मैं वस्तुओं को 2 विशेषताओं जैसे {"नाम": "टेस्ट 1", "आयु": 30} से तुलना करना चाहता हूं?
प्रोबेटेलल

0

सरणी के मूल कार्य कभी-कभी सामान्य छोरों की तुलना में 3X - 5X गुना धीमा होते हैं। इसके अलावा, सभी फ़ंक्शंस में नेटिव फ़ंक्शंस काम नहीं करते हैं, इसलिए संगतता समस्याएं हैं।

मेरा कोड:

<script>
  var obj = [];

  function checkName(name) {
    // declarations
    var flag = 0;
    var len = obj.length;   
    var i = 0;
    var id = 1;

    // looping array
    for (i; i < len; i++) {
        // if name matches
        if (name == obj[i]['username']) {
            flag = 1;
            break;
        } else {
            // increment the id by 1
            id = id + 1;
        }
    }

    // if flag = 1 then name exits else push in array
    if (flag == 0) {
      // new entry push in array        
      obj.push({'id':id, 'username': name});
    }
  }
  // function end

  checkName('abc');
</script>

इस तरह आप तेजी से परिणाम प्राप्त कर सकते हैं।

नोट: मैंने जाँच नहीं की है कि क्या पैरामीटर पारित किया गया है या नहीं, यदि आप चाहते हैं कि आप इस पर चेक लगा सकते हैं या किसी मान्यता के लिए एक नियमित अभिव्यक्ति लिख सकते हैं।


0

xorWith इसे हासिल करने के लिए लोदश में इस्तेमाल किया जा सकता है

let objects = [ { id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 2, username: 'ted' } ]
let existingObject = { id: 1, username: 'fred' };
let newObject = { id: 1729, username: 'Ramanujan' }

_.xorWith(objects, [existingObject], _.isEqual)
// returns [ { id: 2, username: 'bill' }, { id: 2, username: 'ted' } ]

_.xorWith(objects, [newObject], _.isEqual)
// returns [ { id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 2, username: 'ted' } ,{ id: 1729, username: 'Ramanujan' } ]


0

function number_pret_or_not () { var arr = [ 2,5,9,67,78,8,454,4,6,79,64,688 ] ; var found = 6; var found_two; के लिए (i = 0; i)

    }
    if ( found_two == found )
    {
        console.log("number present in the array");
    }
    else
    {
        console.log("number not present in the array");
    }
}

-1

द बेस्ट प्रैक्टिस इस तरह है।

var arr = ["a","b","c","d"];
console.log(arr.includes("a")); //---- true;
console.log(arr.includes("k")); //---- false;
console.log(arr.includes("c")); //---- true;

18
सवाल वस्तुओं की सरणी के बारे में है और यह काम नहीं करेगा।
एड्रियन एनरिकेज़

यह सवाल का जवाब नहीं है।
अहसान मुख्तार

यह उत्तर प्रश्न में उल्लिखित आवश्यकता को पूरा नहीं करता है।
सावन गढ़िया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.