を追加する前に、アレイ内に存在するかどうかを確認するために:私はこの配列を持っているどのように特定のオブジェクトが既にそれを
[{"name": "Olvier", "id": 123 }, {"name": "Olvier", "id": 124 }]
は今、私の目標は、アレイに再び同じオブジェクトを追加しないようにすることである。
{"name": "Olvier", "id": 123 }
これを行う方法はありますか?
を追加する前に、アレイ内に存在するかどうかを確認するために:私はこの配列を持っているどのように特定のオブジェクトが既にそれを
[{"name": "Olvier", "id": 123 }, {"name": "Olvier", "id": 124 }]
は今、私の目標は、アレイに再び同じオブジェクトを追加しないようにすることである。
{"name": "Olvier", "id": 123 }
これを行う方法はありますか?
あなたのオブジェクトは、以前に作成し、配列内の1つのと同じ参照を持っている場合は、あなたが使用することができますindexOf:
var myObj = { a: 'b' };
myArray.push(myObj);
var isInArray = myArray.indexOf(myObj) !== -1;
そうしないと、あなたは、findでそれを確認することができます。
var isInArray = myArray.find(function(el){ return el.id === '123' }) !== undefined;
のidのが一意である場合は、単に特定のIDが存在すると、オブジェクトかどうかを確認することができます
const collection = [
{"name": "Olvier", "id": 123 },
{"name": "Olvier", "id": 124 }
];
let person = { "name": "Olvier", "id": 123 };
function addPerson(person) {
const existingIds = collection.map((addedPerson) => addedPerson.id);
if (! existingIds.includes(person.id)) {
collection.push(person);
}
}
addPerson(person);
var myarray = [{"name": "Olvier", "id": 123 }, {"name": "Olvier", "id": 124 }];
var myobj =
{"name": "Olvier", "id": 123 };
var result = myarray.filter(function (item) {
return (item.name == myobj.name && item.id == myobj.id);
});
if(result.length==0){
//add here
}
@Jonasw私はそれを得ません – Sajeetharan
おそらくID Array#reduce
とArray#filter
var arr =[{"name": "Olvier", "id": 123 }, {"name": "Olvier", "id": 124 }]
var res = arr.reduce((a,b)=>{
if(a.filter(i=> i.name == b.name).length == 0){
a.push(b)
}
return a
},[])
console.log(res)
をチェックして、アレイを再作成 - >オブジェクトの地図はこちらよりよいデータ構造です。あなたはそれのためのラッパーを実装することができます:
class UserList extends Map {
constructor(arr){
super(arr.map(obj => [obj.id,obj]));
}
add(obj){
if(!this.has(obj.id)){
return this.set(obj.id,obj);
}
return false
}
remove(obj){
this.delete(obj.id || obj);
}
}
var users = new UserList([{"name": "Olvier", "id": 123 }, {"name": "Olvier", "id": 124 }]);
console.log(
users.add({name:"Jack",id:123}),//false
users.add({name:"Jack",id:125}),//works
users.delete(124),//removes Olvier
users.get(125),//Jack
[...users.entries()],//a 2d array of [id,obj]
[...users.values()]//objects only array
);
それを行うのは非常に詳細な方法がかなったようなものだ:
var IsIncluded = false;
for(var i; i< array.length; i++) {
if(array[i].name == ObjectToInclude.name && array[i].id == ObjectToInclude.id) {
IsIncluded = true;
break;
}
}
if(!IsIncluded) {
array.push(ObjectToInclude);
}
ちょうどコンストラクタは大文字で始まります。 –
本当ですか? それを知らなかった。 公式な国際大会のリファレンスはありますか? –
*ほとんどの変数と関数は、小文字で始まる必要があります。 新しい接頭辞とともに使用する必要があるコンストラクタ関数は、大文字で始まる必要があります。 JavaScriptは、必要なnewが省略された場合、コンパイル時の警告も実行時の警告も発行しません。新しいことが使われないと悪いことが起きる可能性があるので、大文字の表記が唯一の防衛手段です。 ブラウザのグローバル変数はすべて大文字にする必要があります。* http://javascript.crockford.com/code.html –
あなたは配列に新しいオブジェクトを挿入するためのカスタムメソッドを書くことができます。配列に新しい要素を追加する前に、まず項目が配列に存在するかどうかを確認します。あなたは、その項目が配列に既に存在するかどうか確定するArray#someメソッドを使用することができarray#some
var arr = [{"name": "Olvier", "id": 123 }, {"name": "Olvier", "id": 124 }];
var obj1 = {"name": "Olvier", "id": 123 }, obj2 = {"name": "Olvier", "id": 125 };
var insertUniqueObject = function(arr, obj) {
let isExist = arr.some(o => o.name === obj.name && o.id === obj.id);
if(!isExist)
arr.push(obj);
return arr;
}
console.log(insertUniqueObject(arr, obj1));
console.log(insertUniqueObject(arr, obj2));
を使用することができます。
var arr = [
{ name: 'Olvier', id: 123 },
{ name: 'Olvier', id: 124 }
];
var existingItem = arr[1];
var newItem = { name: 'John', id: 125 };
if (!arr.some(item => item === existingItem)) {
arr.push(existingItem);
}
console.log(arr);
if (!arr.some(item => item === newItem)) {
arr.push(newItem);
}
console.log(arr);
は、IDS独特ますか? –
配列内にあるかどうかを判断するために、すべてのプロパティの値を比較することによって、オブジェクトを比較する必要があります。 Plain 'array.includes'は参照を比較します。 – Nisarg
あなたは、挿入されたオブジェクトを「同じ」と呼ぶのは何ですか?オブジェクトを作成するたびに、JavaScriptによって常に異なるとみなされます。しかし、以前に挿入したオブジェクトを取り込み、再度挿入したい場合(新しいオブジェクトを作成せずに)、それらは同じとみなされます。 – trincot