অ্যারে.পুষ্প () না থাকলে?


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
অ্যারের পরিবর্তে অভিধান (হ্যাশ / ট্রি) ব্যবহার করুন।
টমাস এডিং

এই সব কি জাভাস্ক্রিপ্টে উপলব্ধ?
রাহুল

হ্যাঁ: কোড. google.com/p/jshashtable
টিম ডাউন


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 ({নাম: "tom", পাঠ্য: "সুস্বাদু" function, ফাংশন (ক, খ) {রিটার্ন a.name === b.name && a.text === b.text;});
ভিনসেন্ট রবার্ট

26
আমি ভাবছি কেন এটি ভাষার স্থানীয় না - এটি কীভাবে বাস্তবায়িত হয় তা ভুলে যান - 'অনন্য তবেই যুক্ত করার' ধারণাটি এতটা মৌলিক যেটি অস্তিত্ব ধরে নেওয়া যায়।
জাস্টস্টেভ

9
আপনার ইনআরে পরিবর্তে জাভাস্ক্রিপ্ট ১. method পদ্ধতি ইন্ডেক্সঅফ দিয়ে অ্যারের প্রোটোটাইপ বাড়ানো ভাল।
ইউজিন গ্লুহোটোরেনকো

7
Array.findIndex()একটি অন্তর্নির্মিত জেএস ফাংশন যা আপনার কোডের মতোই অর্জন করবে।

4
অন্তর্নির্মিত অবজেক্টগুলি সরাসরি প্রসারিত করা একটি খারাপ অভ্যাস।
স্লাভা ফমিন দ্বিতীয়

428

স্ট্রিংগুলির অ্যারের জন্য (তবে কোনও বস্তুর অ্যারে নয়), আপনি কল করে কোনও আইটেম উপস্থিত আছেন .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
কেন এটি সঠিক হিসাবে চিহ্নিত করা হচ্ছে তা নিশ্চিত নয় Not এটি কোনও বাহ্যিক ব্যবহার করে না, কোনও এক্সটেনশন তৈরি করার প্রয়োজন হয় না এবং এটি মৃত সহজ। অপশাসনের প্রশ্নের সঠিক উত্তর।
পিম্বারউবার্স

39
প্রাথমিক প্রশ্নে অ্যারের মানগুলি বস্তুগুলি হয়, স্ট্রিং নয় (এবং এই সমাধানটি মান হিসাবে বস্তু হিসাবে যেমন কাজ করে না)।
সাইমন হাই

12
@ এমিলপিডারসন - সত্যই নয়। 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
এই উত্তর ছেলেরা !!
জাফেদ

2
উপস্থিত না থাকলে অ্যারেতে কোনও উপাদান যুক্ত করার জন্য সর্বাধিক প্রাসঙ্গিক
akshay bagade

1
ধন্যবাদ, সর্বত্র এটি খুঁজছিলেন।
dt192

41

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

var cleanArray = $.unique(clutteredArray);

আপনি মেকআরারেও আগ্রহী হতে পারেন

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

আমি নিশ্চিত না, যদি সূচকইফ দ্রুততর রুটে থাকে তবে অ্যারে? সম্ভবত।

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 IE8 তে কাজ করে না :(
dmathisen

আপনি লড্যাশ _.আইডেক্সওফ ব্যবহার করতে পারেন, এটি আইই 8-এ কাজ করবে
এলট্রোয়া

25

ঠিক এই কারণগুলির জন্য আন্ডারস্কোর.জেএস এর মতো জেএস লাইব্রেরি ব্যবহার করুন । ব্যবহার: ইউনিয়ন: পাস-ইন করা অ্যারেগুলির ইউনিয়ন গণনা করে: একক বা একাধিক অ্যারে উপস্থিত থাকে এমন ক্রমযুক্ত অনন্য আইটেমগুলির তালিকা।

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

8
দ্রষ্টব্য, এটি একটি নতুন অ্যারে প্রদান করে এবং বাস্তবে কোনও বিদ্যমান অ্যারেতে ধাক্কা দেয় না।
ilovett

4
আইএমএইচও-তে এত সাধারণ
কোনও কিছুর

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
আপনার hands.Simple করতে স্বাস্থ্য ও সুন্দর সমাধান @Gopala রাজা naika
Nasimba

11

আমি আপনাকে একটি সেট ব্যবহার করার পরামর্শ দিচ্ছি ,

সেটগুলি কেবল অনন্য প্রবেশের অনুমতি দেয় যা স্বয়ংক্রিয়ভাবে আপনার সমস্যার সমাধান করে।

সেটগুলি এর মতো ঘোষিত হতে পারে:

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

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

প্রশ্ন সম্পর্কে জিজ্ঞেস করে 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);
    }
};

আপডেট: ইন্ডেক্সঅফ প্রতিস্থাপন এবং আইই 8 এর সামঞ্জস্যের জন্য jQuery বিকল্পগুলি দিয়ে ছাঁটা


এটি একটি দুর্দান্ত সমাধান, তবে কেন ট্রিম ব্যবহার করবেন?
দেজন ডোজেট

2

আমি মানচিত্রটি ব্যবহার করেছি এবং এটি হ্রাস করতে আপনি যেখানে কোনও বস্তুর নির্দিষ্ট সম্পত্তি দ্বারা সন্ধান করতে ইচ্ছুক, সরাসরি অবজেক্টের সমতা করার জন্য দরকারী ব্যর্থ হবে often

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

আপনি কলব্যাক ফাংশন এবং এর "এই" পরামিতি দিয়ে ফাইন্ড ইন্ডেক্স পদ্ধতিটি ব্যবহার করতে পারেন।

দ্রষ্টব্য: পুরানো ব্রাউজারগুলি ফাইন্ড ইন্ডেক্সটি জানে না তবে একটি পলিফিল পাওয়া যায়।

নমুনা কোড (লক্ষ্য রাখবেন যে মূল প্রশ্নে, কোনও নতুন অবজেক্ট কেবল তখনই ঠেলাঠেলি করা হয় যদি এর ডেটাগুলির কোনওটিই প্রাকৃতিকভাবে চালিত বস্তুর মধ্যে না থাকে):

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 গ্রেপ ব্যবহার করতে পারেন এবং কোনও ফলাফল না হলে ধাক্কা দিতে পারেন: http://api.jquery.com/jQuery.grep/

এটি মূলত "প্রোটোটাইপ বাড়ানো" সমাধানের মতো একই সমাধান, তবে প্রোটোটাইপ বাড়ানো (বা দূষণকারী) না করে।


-2

আপনি foreach ব্যবহার করে অ্যারেটি পরীক্ষা করতে পারেন এবং আইটেমটি উপস্থিত থাকলে তা পপ করতে পারেন অন্যথায় নতুন আইটেম যুক্ত করুন ...

নমুনা নতুন আইটেমভ্যালু এবং জমা দেওয়ার ফিল্ডগুলি কী, মান জোড়া

> //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});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.