web-dev-qa-db-ja.com

オブジェクト値がオブジェクトのJavascript配列内に存在するかどうかを確認し、存在しない場合は新しいオブジェクトを配列に追加します

次のようなオブジェクトの配列があるとします。

[ { id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 2, username: 'ted' } ]

特定のユーザー名の値が既に存在しているかどうかを確認するために配列をループ処理する方法はありますか。

ありがとうございます。

94
user2576960

ここではidsが一意であることを意味していると思いました。 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'));
167
Andy

既存のユーザー名を確認するのはどちらかといえば簡単です。

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

しかし、この配列に新しいユーザーを追加する必要があるときに何をすればよいかはあまり明確ではありません。最も簡単な方法は、idarray.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の一意性は保証されますが、一部の要素が削除された場合、この配列は少し奇妙に見えます。

19
raina77ow

この小さな断片は私のために働きます..

const arrayOfObject = [{ id: 1, name: 'john' }, {id: 2, name: 'max'}];

const checkUsername = obj => obj.name === 'max';

console.log(arrayOfObject.some(checkUsername))
8
Sagar Gavhane

ベストプラクティスはこのようなものです。

var arr = ["a","b","c","d"];
console.log(arr.includes("a")); //---- true;
console.log(arr.includes("k")); //---- false;
console.log(arr.includes("c")); //---- true;
5

私は、これがこの問題に取り組むための最短の方法だと思います。ここで私は新しく追加されたユーザー名の存在をチェックするために.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);

フィドルへのリンク

2
Kushan Randima

私は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 };
}
1
Uxonith

あなたはそれをよりモジュール式にするためにあなたのアレイをプロトタイプ化することができます、このようなことを試してください

    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)
0
Luis Saraza

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' } ]
0
sudo bangbang

承認された答えは、.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 }); }
 }
0
Hemadri Dasari

ここでそれをチェックしてください。

https://stackoverflow.com/a/53644664/1084987

あとでif conditionのようなものを作ることができます。

if(!contains(array, obj)) add();
0
Clyde

配列のネイティブ関数は、通常のループよりも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>

この方法であなたはより早く結果を達成することができます。

注:渡されたパラメータが空かどうかを確認していません。必要に応じて、チェックを付けたり、特定の検証用の正規表現を記述したりできます。

0
Zaheen