次のようなオブジェクトの配列があるとします。
[ { id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 2, username: 'ted' } ]
特定のユーザー名の値が既に存在しているかどうかを確認するために配列をループ処理する方法はありますか。
ありがとうございます。
ここではid
sが一意であることを意味していると思いました。 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'));
既存のユーザー名を確認するのはどちらかといえば簡単です。
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
IDの一意性は保証されますが、一部の要素が削除された場合、この配列は少し奇妙に見えます。
この小さな断片は私のために働きます..
const arrayOfObject = [{ id: 1, name: 'john' }, {id: 2, name: 'max'}];
const checkUsername = obj => obj.name === 'max';
console.log(arrayOfObject.some(checkUsername))
ベストプラクティスはこのようなものです。
var arr = ["a","b","c","d"];
console.log(arr.includes("a")); //---- true;
console.log(arr.includes("k")); //---- false;
console.log(arr.includes("c")); //---- true;
私は、これがこの問題に取り組むための最短の方法だと思います。ここで私は新しく追加されたユーザー名の存在をチェックするために.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);
私はAndyの答えを気に入っていますが、IDが必ずしも一意であるとは限らないので、一意のIDを作成するために私が思いついたのがここにあります。 jsfiddle でも確認できます。 arr.length + 1
は、以前に何かが削除されていた場合、一意のIDを保証するものではないことにご注意ください。
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 };
}
あなたはそれをよりモジュール式にするためにあなたのアレイをプロトタイプ化することができます、このようなことを試してください
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)
Lodashの 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' } ]
承認された答えは、.someのarrow機能を使って、次のように書くこともできます。
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 }); }
}
ここでそれをチェックしてください。
https://stackoverflow.com/a/53644664/1084987
あとでif conditionのようなものを作ることができます。
if(!contains(array, obj)) add();
配列のネイティブ関数は、通常のループよりも3倍から5倍遅いことがあります。さらに、ネイティブ機能はすべてのブラウザで機能しないため、互換性の問題があります。
私のコード:
<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>
この方法であなたはより早く結果を達成することができます。
注:渡されたパラメータが空かどうかを確認していません。必要に応じて、チェックを付けたり、特定の検証用の正規表現を記述したりできます。