335

どちらの値も存在しない場合、どうすれば配列にプッシュできますか?これが私の配列です:

[
    { 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()

これどうやってするの?

4

28 に答える 28

552

文字列の配列(オブジェクトの配列ではない)の場合、を呼び出すことでアイテムが存在するかどうかを確認でき、存在.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)

于 2016-04-17T23:32:40.757 に答える
171

Array.findIndex関数を引数として取る関数を使用すると、非常に簡単に実行できます。

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

index === -1 ? arrayObj.push({your_object}) : console.log("object already exists")
 
于 2016-06-09T13:16:32.713 に答える
127

カスタムメソッドを使用して配列プロトタイプを拡張できます。

// 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; 
});
于 2010-01-01T11:12:31.320 に答える
43

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

var cleanArray = $.unique(clutteredArray);

あなたもmakeArrayに興味があるかもしれません

前の例は、プッシュする前に存在するかどうかを確認するのに最適です。後から考えると、プロトタイプの一部として宣言できることも示されているので(これは、クラス拡張とも呼ばれます)、以下では大きな拡張はありません。

indexOfがinArrayよりも高速なルートであるかどうかわからない場合を除いて?おそらく。

Array.prototype.pushUnique = function (item){
    if(this.indexOf(item) == -1) {
    //if(jQuery.inArray(item, this) == -1) {
        this.push(item);
        return true;
    }
    return false;
}
于 2012-10-13T23:02:08.320 に答える
33

このような?

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)
于 2017-03-04T17:35:26.597 に答える
31

これは非常に古い質問ですが、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 }])
于 2017-04-24T14:28:49.087 に答える
30

動的にプッシュ

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);
于 2019-02-07T13:53:03.963 に答える
26

これらの理由から、 underscore.jsのようなjsライブラリを使用してください。使用法:union:渡された配列の和集合を計算します。1つ以上の配列に存在する一意の項目のリストを順番に計算します。

_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2, 3, 101, 10]
于 2014-06-02T18:39:02.497 に答える
24

簡単なコード。「indexOf」が「-1」を返す場合、要素が配列内にないことを意味し、条件「===-1」はtrue/falseを取得します。

'&&'演算子は'と'を意味するため、最初の条件がtrueの場合、それを配列にプッシュします。

array.indexOf(newItem) === -1 && array.push(newItem);
于 2020-01-08T08:07:59.630 に答える
18

セットを使用することをお勧めします、

セットは一意のエントリのみを許可し、問題を自動的に解決します。

セットは次のように宣言できます。

const baz = new Set(["Foo","Bar"])
于 2019-04-23T22:49:29.927 に答える
8

私の選択は.includes()、@ Darrin Dimitrovが提案したように、Array.prototypeの拡張を使用することでした。

Array.prototype.pushIfNotIncluded = function (element) {
    if (!this.includes(element)) {
      this.push(element);
    }
}

includesこれはes6からのものであり、IEでは機能しない ことを覚えておいてください: https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes

于 2021-01-19T16:02:22.110 に答える
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);
}
于 2017-11-20T02:32:01.197 に答える
3

誰かがそれほど複雑でない要件を持っている場合のために、これが単純な文字列配列に対する答えの私の適応です:

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

更新:IE8の互換性のためにindexOfとtrimをjQueryの代替に置き換えました

于 2015-03-25T17:16:33.340 に答える
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);
}
于 2016-01-15T06:37:27.220 に答える
2

オブジェクトの特定のプロパティで検索したい場合は、mapとreduceを使用してこれを実行しました。これは、オブジェクトを直接等しくすることが失敗することが多いため便利です。

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");
}
于 2016-08-23T17:51:35.693 に答える
2

findIndexメソッドは、コールバック関数とその「this」パラメーターで使用できます。

注:古いブラウザは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
于 2016-11-07T14:40:29.650 に答える
2

私はここで答えるには遅すぎると思いますが、これは私が書いたメールマネージャーのために私が最終的に思いついたものです。必要なのはそれだけです。

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>

于 2019-07-01T08:22:01.120 に答える
2

aはあなたが持っているオブジェクトの配列です

a.findIndex(x => x.property=="WhateverPropertyYouWantToMatch") <0 ? 
a.push(objectYouWantToPush) : console.log("response if object exists");
于 2019-10-12T14:04:35.600 に答える
2

プッシュ後に重複を削除する

重複を含む配列がすでにある場合は、オブジェクトの配列を文字列の配列に変換してから、Set()関数を使用して重複を排除します。

let arr_obj = [
    { name: "tom", text: "tasty" }, 
    { name: "tom", text: "tasty" }
]

let arr_str = arr_obj.map(JSON.stringify)

let arr_unique = [...new Set(arr_str)].map(JSON.parse) 

押す前に確認する

これまでに重複がなく、新しい要素をプッシュする前に重複をチェックしたい場合:

let arr_obj = [
    { name: "tom", text: "tasty" },
    { name: "tim", text: "tusty" }
]

let new_obj = { name: "tom", text: "tasty" }

let arr_str = arr_obj.map(JSON.stringify)

!arr_str.includes(JSON.stringify(new_obj)) && arr_obj.push(new_obj)
于 2020-10-27T10:15:04.793 に答える
1

ここでは、2つの配列に対して1行でそれを行う方法があります。

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]
于 2020-03-29T15:48:29.007 に答える
1

質問は少し古いものでしたが、私の選択肢は:

    let finalTab = [{id: 1, name: 'dupont'}, {id: 2, name: 'tintin'}, {id: 3, name:'toto'}]; // Your array of object you want to populate with distinct data
    const tabToCompare = [{id: 1, name: 'dupont'}, {id: 4, name: 'tata'}]; // A array with 1 new data and 1 is contain into finalTab
    
    finalTab.push(
      ...tabToCompare.filter(
        tabToC => !finalTab.find(
          finalT => finalT.id === tabToC.id)
      )
    ); // Just filter the first array, and check if data into tabToCompare is not into finalTab, finally push the result of the filters

    console.log(finalTab); // Output : [{id: 1, name: 'dupont'}, {id: 2, name: 'tintin'}, {id: 3, name: 'toto'}, {id: 4, name: 'tata'}];
于 2021-06-25T08:07:38.477 に答える
1

Array.prototype.some()jQ env
Docs:w3ssomeまたはmdnでもネイティブjsを使用したいsome

let arr = [
    { name: "tom", text: "tasty" },
    { name: "tom", text: "tasty" },
    { name: "tom", text: "tasty" },
    { name: "tom", text: "tasty" },
    { name: "tom", text: "tasty" }
];
let oneMore = { name: "tom", text: "tasty" };
!arr.some(i => i.name == oneMore.name && i.text == oneMore.text)
  && arr.push(oneMore);
于 2022-02-04T22:07:06.767 に答える
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;
    };
于 2017-05-18T05:11:34.600 に答える
0

簡単な例:

if (typeof(arr[key]) === "undefined") {
  arr.push(key);
}
于 2018-07-26T16:59:26.390 に答える
0
someArray = [{a: 'a1 value', b: {c: "c1 value"},
             {a: 'a2 value', b: {c: "c2 value"}]
newObject = {a: 'a2 value', b: {c: "c2 value"}}

//New object which needs check for duplicity

let isExists = checkForExists(newObject) {
    return someArray.some(function(el) {
        return el.a === newObject.a && el.b.c === newObject.b.c;
    });
}
// write your logic here 
// if isExists is true then already object in an array else you can add
于 2020-07-09T08:14:30.467 に答える
0

私はこの問題を抱えていて、簡単なプロトタイプを作成しました。気に入ったらそれを使用してください

Array.prototype.findOrPush = function(predicate, fallbackVal) {
    let item = this.find(predicate)
    if(!item){
        item = fallbackVal
        this.push(item)
    }
    return item
}

let arr = [{id: 1}]
let item = arr.findOrPush(e => e.id == 2, {id: 2})
console.log(item) // {id: 2} 

// will not push and just return existing value
arr.findOrPush(e => e.id == 2, {id: 2}) 
conslog.log(arr)  // [{id: 1}, {id: 2}]

于 2021-10-13T17:50:55.860 に答える
-2

jQuery grepを使用して、結果がない場合はプッシュできます:http: //api.jquery.com/jQuery.grep/

これは基本的に「プロトタイプの拡張」ソリューションと同じソリューションですが、プロトタイプを拡張(または汚染)することはありません。

于 2013-07-24T12:59:56.223 に答える
-2

foreachを使用して配列を確認し、存在する場合はアイテムをポップし、存在しない場合は新しいアイテムを追加します...

サンプルの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});
于 2016-07-13T17:01:09.687 に答える