Array.push () मौजूद नहीं है तो?


247

यदि कोई मान मौजूद नहीं है, तो मैं किसी सरणी में कैसे धकेल सकता हूं? यहाँ मेरी सरणी है:

[
    { name: "tom", text: "tasty" },
    { name: "tom", text: "tasty" },
    { name: "tom", text: "tasty" },
    { name: "tom", text: "tasty" },
    { name: "tom", text: "tasty" }
]

अगर मैंने फिर से name: "tom"या तो सरणी में धकेलने की कोशिश की या text: "tasty", मैं कुछ भी नहीं करना चाहता ... लेकिन अगर उनमें से कोई भी नहीं है, तो मैं इसे चाहता हूं.push()

मैं यह कैसे कर सकता हूँ?


5
एक सरणी के बजाय एक शब्दकोश (हैश / ट्री) का उपयोग करें।
थॉमस एडिंग

क्या ये सभी जावास्क्रिप्ट में उपलब्ध हैं?
राहुल



1
सेट वस्तुओं की सरणी के साथ काम नहीं करता
rffaguiar

जवाबों:


114

आप कस्टम पद्धति के साथ ऐरे प्रोटोटाइप का विस्तार कर सकते हैं:

// check if an element exists in array using a comparer function
// comparer : function(currentElement)
Array.prototype.inArray = function(comparer) { 
    for(var i=0; i < this.length; i++) { 
        if(comparer(this[i])) return true; 
    }
    return false; 
}; 

// adds an element to the array if it does not already exist using a comparer 
// function
Array.prototype.pushIfNotExist = function(element, comparer) { 
    if (!this.inArray(comparer)) {
        this.push(element);
    }
}; 

var array = [{ name: "tom", text: "tasty" }];
var element = { name: "tom", text: "tasty" };
array.pushIfNotExist(element, function(e) { 
    return e.name === element.name && e.text === element.text; 
});

5
मुझे लगता है कि आपके कैंपर (तुलनित्र?) को दो तर्क देने चाहिए, यह मामले को सरल करेगा जब जोड़ा मूल्य इनलाइन है और एक चर में नहीं है जिसे आप अपने फ़ंक्शन में एक्सेस कर सकते हैं। array.pushIfNotExist ({नाम: "टॉम", टेक्स्ट: "स्वादिष्ट"}, फ़ंक्शन (ए, बी) {वापसी a.name === b.name && a.text === b.text;});
विंसेंट रॉबर्ट

26
मैं सोच रहा हूं कि यह भाषा का मूल क्यों नहीं है - भूल जाओ कि इसे कैसे लागू किया जाता है - 'केवल अद्वितीय जोड़ने पर' का विचार इतना मौलिक है कि इसे अस्तित्व में मान लिया जाए।
JustSteve

9
जावास्क्रिप्ट के साथ ऐरे प्रोटोटाइप का विस्तार करना बेहतर है, अपने inArray के बजाय जावास्क्रिप्ट 1.6 विधि IndexOf के साथ।
यूजीन ग्लुहटोरेंको

7
Array.findIndex()एक अंतर्निहित जेएस फ़ंक्शन है जो आपके कोड के समान ही प्राप्त करेगा।

4
अंतर्निहित वस्तुओं को सीधे निकालना एक बुरा अभ्यास है।
स्लाव फोमिन II

429

तार की एक सरणी के लिए (लेकिन वस्तुओं की एक सरणी नहीं), आप यह देख सकते हैं कि क्या कोई वस्तु कॉल करके मौजूद है .indexOf()और यदि यह नहीं है तो आइटम को केवल सरणी में धकेलें :

var newItem = "NEW_ITEM_TO_ARRAY";
var array = ["OLD_ITEM_1", "OLD_ITEM_2"];

array.indexOf(newItem) === -1 ? array.push(newItem) : console.log("This item already exists");

console.log(array)


50
निश्चित नहीं है कि इसे सही के रूप में चिह्नित क्यों नहीं किया गया है। यह किसी भी बाहरी उपयोग नहीं करता है, एक एक्सटेंशन बनाने की आवश्यकता नहीं है और यह मृत सरल है। ऑप्स प्रश्न के लिए एकदम सही जवाब।
17:16

39
प्रारंभिक प्रश्न में, सरणी के मान ऑब्जेक्ट हैं, स्ट्रिंग्स नहीं (और यह समाधान काम नहीं करता है जैसे मान ऑब्जेक्ट हैं)।
साइमन हाय

12
@EmilPedersen - वास्तव में नहीं। if (a.indexOf({ name: "tom", text: "tasty" })!=-1) a.push({ name: "tom", text: "tasty" })दो बार कोशिश करो । यह एक 'समान' ऑब्जेक्ट को दो बार जोड़ देगा।
आमपाइक

18
यह उत्तर हटा दिया जाना चाहिए क्योंकि यह वस्तुनिष्ठ रूप से गलत है, लेकिन फिर भी सबसे अधिक संख्या में उठाव हुआ है।
निकोला

2
यह एक सही उत्तर नहीं है, क्यों स्वीकार किया जाता है? यह सिर्फ जेएस सरणियों के लिए काम करता है, न कि सरणियों के भीतर वस्तु।
डिजिट

100

Array.findIndexफ़ंक्शन का उपयोग करना काफी आसान है , जो एक फ़ंक्शन को तर्क के रूप में लेता है:

var a = [{name:"bull", text: "sour"},
    { name: "tom", text: "tasty" },
    { name: "tom", text: "tasty" }
]
var index = a.findIndex(x => x.name=="bob")
// here you can check specific property for an object whether it exist in your array or not

if (index === -1){
    a.push({your_object});
}
else console.log("object already exists")

8
यह जवाब है दोस्तों !!
jafed

2
सरणी में एक तत्व जोड़ने के लिए सबसे अधिक प्रासंगिक है यदि मौजूद नहीं है
अक्षय बगादे

1
धन्यवाद, हर जगह इस के लिए देख रहा था।
dt192

41

http://api.jquery.com/jQuery.unique/

var cleanArray = $.unique(clutteredArray);

आप मेकअरे में भी दिलचस्पी ले सकते हैं

पिछला उदाहरण यह कहने में सबसे अच्छा है कि जाँच करें कि क्या यह धक्का देने से पहले मौजूद है। मुझे लगता है कि यह भी बताता है कि आप इसे प्रोटोटाइप के हिस्से के रूप में घोषित कर सकते हैं (मुझे लगता है कि उर्फ ​​क्लास एक्सटेंशन है), इसलिए नीचे कोई बड़ी वृद्धि नहीं है।

सिवाय मुझे यकीन नहीं है कि अगर indexOf एक तेज़ मार्ग है तो फिर ऐरे? शायद।

Array.prototype.pushUnique = function (item){
    if(this.indexOf(item) == -1) {
    //if(jQuery.inArray(item, this) == -1) {
        this.push(item);
        return true;
    }
    return false;
}

22
JQuery लिंक से: Note that this only works on arrays of DOM elements, not strings or numbers.इसके अलावा,
इंडेक्सऑफ

आप लॉश _.indexOf का उपयोग कर सकते हैं, जो 15:8 में IE8
LTroya

25

इन कारणों से बिल्कुल अंडरस्कोर.जैस जैसी जेएस लाइब्रेरी का उपयोग करें । उपयोग: संघ: पास किए गए सरणियों के संघ की गणना करता है: अद्वितीय वस्तुओं की सूची, क्रम में, जो एक या एक से अधिक सरणियों में मौजूद हैं।

_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2, 3, 101, 10]

8
ध्यान दें, यह एक नया सरणी देता है और वास्तव में मौजूदा सरणी पर धकेलता नहीं है।
ilovett

4
IMHO वास्तव में कुछ सरल के खिलाफ परीक्षण करने के लिए एक फ्रेमवर्क में लाने की कोई आवश्यकता नहीं है
ड्रयू 18

24

ऐशे ही?

var item = "Hello World";
var array = [];
if (array.indexOf(item) === -1) array.push(item);

वस्तु के साथ

var item = {name: "tom", text: "tasty"}
var array = [{}]
if (!array.find(o => o.name === 'tom' && o.text === 'tasty'))
    array.push(item)

4
array.findएक बुरा विचार है क्योंकि यह संपूर्ण सरणी को खोजता है। उपयोग करें findIndex, जो केवल पहली घटना तक खोज करता है।

3
इसके अनुसार @ K48: stackoverflow.com/a/33759573/5227365 आइटम खोजने के बाद "रुक जाता है"
पास्कल

19

मुझे पता है कि यह एक बहुत पुराना प्रश्न है, लेकिन यदि आप ES6 का उपयोग कर रहे हैं, तो आप बहुत छोटे संस्करण का उपयोग कर सकते हैं:

[1,2,3].filter(f => f !== 3).concat([3])

बहुत आसान है, पहले एक फ़िल्टर जोड़ें जो आइटम को हटा देता है - अगर यह पहले से मौजूद है, और फिर इसे एक कॉनैट के माध्यम से जोड़ें।

यहाँ एक और अधिक यथार्थवादी उदाहरण है:

const myArray = ['hello', 'world']
const newArrayItem

myArray.filter(f => f !== newArrayItem).concat([newArrayItem])

यदि आप सरणी में ऐसी वस्तुएं हैं जिन्हें आप फ़िल्टर फ़ंक्शन को इस तरह से अनुकूलित कर सकते हैं:

someArray.filter(f => f.some(s => s.id === myId)).concat([{ id: myId }])

3
यहाँ एक सुंदर समाधान है। धन्यवाद!
जोनाथन पिकाज़ो

18

गतिशील रूप से पुश करें

var a = [
  {name:"bull", text: "sour"},
  {name: "tom", text: "tasty" },
  {name: "Jerry", text: "tasty" }
]

function addItem(item) {
  var index = a.findIndex(x => x.name == item.name)
  if (index === -1) {
    a.push(item);
  }else {
    console.log("object already exists")
  }
}

var item = {name:"bull", text: "sour"};
addItem(item);

सरल विधि में

var item = {name:"bull", text: "sour"};
a.findIndex(x => x.name == item.name) == -1 ? a.push(item) : console.log("object already exists")

यदि सरणी में केवल आदिम प्रकार / सरल सरणी हैं

var b = [1, 7, 8, 4, 3];
var newItem = 6;
b.indexOf(newItem) === -1 && b.push(newItem);

2
आपके हाथों को स्वास्थ्य। सुंदर और सुंदर समाधान @ गोपाला राज निका
नसीम्बा

11

मैं आपको एक सेट का उपयोग करने का सुझाव दूंगा ,

सेट केवल अद्वितीय प्रविष्टियों की अनुमति देते हैं, जो स्वचालित रूप से आपकी समस्या को हल करता है।

सेट को इस तरह घोषित किया जा सकता है:

const baz = new Set(["Foo","Bar"])

@Michael की ओर इशारा करने के लिए धन्यवाद। जब हम न्यूनतम प्रयास के साथ अलग डेटा बनाए रखना चाहते हैं तो इसके लिए अच्छा समाधान है। एफडब्ल्यूआईडब्ल्यू, यह ध्यान रखना महत्वपूर्ण है कि सरणी प्रदर्शन बेहतर है क्योंकि इसमें आवश्यक होने पर तत्व को लाने के लिए कम सीपीयू की आवश्यकता होती है।
बेन

के बारे में सवाल पूछता है Array.push, तो Set.addउस के बराबर है।
bryc

9

आसान कोड, यदि 'indexOf' '-1' देता है, तो इसका मतलब है कि तत्व सरणी के अंदर नहीं है, तो स्थिति '=== -1' सही / गलत है।

'&&' ऑपरेटर का अर्थ है 'और', इसलिए यदि पहली शर्त सही है तो हम इसे एरे पर धकेल देते हैं।

array.indexOf(newItem) === -1 && array.push(newItem);

@ डी। लॉरेंस हाँ, अब बहुत बेहतर है।
एरिक वलेरो

अन्य स्वीकृत उत्तर हैं जो ओपी के प्रश्न प्रदान करते हैं, और उन्हें कुछ समय पहले पोस्ट किया गया था। उत्तर पोस्ट करते समय देखें: मैं एक अच्छा उत्तर कैसे लिखूं? , कृपया सुनिश्चित करें कि आप या तो एक नया समाधान, या काफी बेहतर स्पष्टीकरण जोड़ते हैं, खासकर जब पुराने प्रश्नों का उत्तर दे रहे हों।
help-info.de

4

गति के बारे में निश्चित नहीं है, लेकिन stringification+ indexOfएक सरल तरीका है। अपने सरणी को स्ट्रिंग में बदलना शुरू करें:

let strMyArray = JSON.stringify(myArray);

फिर विशेषता-मूल्य जोड़े की एक श्रृंखला के लिए जिसका आप उपयोग कर सकते हैं:

if (strMyArray.indexOf('"name":"tom"') === -1 && strMyArray.indexOf('"text":"tasty"') === -1) {
   myArray.push({ name: "tom", text: "tasty" });
}

संपूर्ण वस्तु को खोजना सरल है:

if (strMyArray.indexOf(JSON.stringify(objAddMe) === -1) { 
   myArray.push(objAddMe);
}

3

मामले में आपको ऐरे प्रोटोटाइप का विस्तार किए बिना कुछ सरल की आवश्यकता है:

// Example array
var array = [{id: 1}, {id: 2}, {id: 3}];

function pushIfNew(obj) {
  for (var i = 0; i < array.length; i++) {
    if (array[i].id === obj.id) { // modify whatever property you need
      return;
    }
  }
  array.push(obj);
}

3

यदि किसी के पास कम जटिल आवश्यकताएं हैं, तो यहां एक साधारण स्ट्रिंग सरणी के लिए मेरे उत्तर का अनुकूलन है:

Array.prototype.pushIfNotExist = function(val) {
    if (typeof(val) == 'undefined' || val == '') { return; }
    val = $.trim(val);
    if ($.inArray(val, this) == -1) {
        this.push(val);
    }
};

अद्यतन: बदली हुई अनुक्रमणिका और IE8 संगतता के लिए jQuery विकल्प के साथ ट्रिम करें


यह एक अच्छा समाधान है, लेकिन ट्रिम का उपयोग क्यों करें?
देजान डोज़ेट

2

मैंने मानचित्र का उपयोग किया और इस मामले में ऐसा करने के लिए कम किया, जहां आप किसी वस्तु की विशिष्ट संपत्ति द्वारा खोज करना चाहते हैं, प्रत्यक्ष वस्तु समानता करने के रूप में उपयोगी अक्सर विफल हो जाएगा।

var newItem = {'unique_id': 123};
var searchList = [{'unique_id' : 123}, {'unique_id' : 456}];

hasDuplicate = searchList
   .map(function(e){return e.unique_id== newItem.unique_id})
   .reduce(function(pre, cur) {return pre || cur});

if (hasDuplicate) {
   searchList.push(newItem);
} else {
   console.log("Duplicate Item");
}

2

संक्षिप्त उदाहरण:

if (typeof(arr[key]) === "undefined") {
  arr.push(key);
}

1
गलत। हम कुंजी को धक्का देने में रुचि नहीं रखते हैं, हम एक नाम-मूल्य जोड़ी को आगे बढ़ाना चाहते हैं, लेकिन केवल अगर यह पहले से मौजूद नहीं है।
स्टीफन

2

ए आपके पास वस्तुओं का एक सरणी है

a.findIndex(x => x.property=="WhateverPropertyYouWantToMatch") <0 ? 
a.push(objectYouWantToPush) : console.log("response if object exists");

1

आप कॉलबैक फ़ंक्शन और इसके "इस" पैरामीटर के साथ फाइंडइंडेक्स विधि का उपयोग कर सकते हैं।

नोट: पुराने ब्राउज़र findIndex को नहीं जानते लेकिन एक पॉलीफ़िल उपलब्ध है।

नमूना कोड (ध्यान रखें कि मूल प्रश्न में, एक नई वस्तु को केवल तभी धकेला जाता है, जब उसका कोई भी डेटा प्रीवियसली पुश की गई वस्तुओं में न हो):

var a=[{name:"tom", text:"tasty"}], b;
var magic=function(e) {
    return ((e.name == this.name) || (e.text == this.text));
};

b={name:"tom", text:"tasty"};
if (a.findIndex(magic,b) == -1)
    a.push(b); // nothing done
b={name:"tom", text:"ugly"};
if (a.findIndex(magic,b) == -1)
    a.push(b); // nothing done
b={name:"bob", text:"tasty"};
if (a.findIndex(magic,b) == -1)
    a.push(b); // nothing done
b={name:"bob", text:"ugly"};
if (a.findIndex(magic,b) == -1)
    a.push(b); // b is pushed into a

1

मुझे लगता है कि मुझे यहां जवाब देने में बहुत देर हो गई है लेकिन यह वही है जो मैंने एक मेल मैनेजर के लिए लिखा था। काम करता है कि मैं सब की जरूरत है।

window.ListManager = [];
$('#add').click(function(){
//Your Functionality
  let data =Math.floor(Math.random() * 5) + 1 
  
  if (window.ListManager.includes(data)){
      console.log("data exists in list")
  }else{
       window.ListManager.push(data);
  }
  
  
  $('#result').text(window.ListManager);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1>Unique List</h1>

<p id="result"></p>
<button id="add">Add to List</button>


0

यह एक वस्तु की तुलना के लिए काम कर रहा है। कुछ मामलों में आपके पास तुलना करने के लिए बहुत सारे क्षेत्र हो सकते हैं। बस ऐरे को लूप करें और इस फ़ंक्शन को एक मौजूदा आइटम और नए आइटम के साथ कॉल करें।

 var objectsEqual = function (object1, object2) {
        if(!object1 || !object2)
            return false;
        var result = true;
        var arrayObj1 = _.keys(object1);
        var currentKey = "";
        for (var i = 0; i < arrayObj1.length; i++) {
            currentKey = arrayObj1[i];
            if (object1[currentKey] !== null && object2[currentKey] !== null)
                if (!_.has(object2, currentKey) ||
                    !_.isEqual(object1[currentKey].toUpperCase(), object2[currentKey].toUpperCase()))
                    return false;
        }
        return result;
    };

0

यहां आपके पास दो सरणियों के लिए एक पंक्ति में इसे करने का एक तरीका है:

const startArray = [1,2,3,4]
const newArray = [4,5,6]

const result = [...startArray, ...newArray.filter(a => !startArray.includes(a))]

console.log(result);
//Result: [1,2,3,4,5,6]

-1

आप jQuery grep का उपयोग कर सकते हैं और यदि कोई परिणाम नहीं मिलता है तो धक्का दें: http://api.jquery.com/jQuery.grep/

यह मूल रूप से "प्रोटोटाइप का विस्तार" समाधान के रूप में एक ही समाधान है, लेकिन प्रोटोटाइप को विस्तारित (या प्रदूषित) किए बिना।


-2

आप फ़ॉर्च का उपयोग करके सरणी की जांच कर सकते हैं और फिर आइटम को पॉप कर सकते हैं यदि यह मौजूद है अन्यथा नया आइटम जोड़ें ...

नमूना newItemValue और submitFields कुंजी, मूल्य जोड़े हैं

> //submitFields existing array
>      angular.forEach(submitFields, function(item) {
>                   index++; //newItemValue new key,value to check
>                     if (newItemValue == item.value) {
>                       submitFields.splice(index-1,1);
>                         
>                     } });

                submitFields.push({"field":field,"value":value});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.