Periksa apakah nilai objek ada dalam array Javascript objek dan jika tidak menambahkan objek baru ke array

146

Jika saya memiliki array objek berikut:

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

Apakah ada cara untuk loop melalui array untuk memeriksa apakah nilai nama pengguna tertentu sudah ada dan jika tidak melakukan apa-apa, tetapi jika itu tidak menambahkan objek baru ke array dengan nama pengguna tersebut (dan ID baru)?

Terima kasih!

pengguna2576960
sumber
1
Apakah Bill dan Ted seharusnya memiliki ID yang sama?
user2357112 mendukung Monica
Mengapa ada dua elemen yang sama id? Apakah mungkin elemen akan dihapus dari array ini, atau dapatkah kita yakin bahwa elemen baru akan selalu idsama dengan arr.length + 1?
raina77ow
Jika Anda tidak ingin mengulanginya, periksa Tanya Jawab ini untuk memperluas prototipe array, stackoverflow.com/questions/1988349/… .
Cem Özer
fungsi asli lebih lambat dibandingkan dengan loop normal dan dukungannya terbatas pada beberapa versi browser. periksa jawaban saya di bawah ini.
Zaheen
ini adalah pertanyaan yang pada dasarnya salah karena Anda dapat melakukannya dengan menghindari penggunaan Array.
Bekim Bacaj

Jawaban:

234

Saya berasumsi bahwa ids dimaksudkan untuk menjadi unik di sini. someadalah fungsi yang bagus untuk memeriksa keberadaan hal-hal dalam array:

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'));

Andy
sumber
1
Terima kasih Andy, ini adalah solusi yang sangat bersih untuk masalah ini dan bekerja dengan sangat baik. Saya belum pernah menemukan beberapa metode sebelumnya. Asumsi Anda benar ID contoh saya hanya salah ketik, saya menggunakan arr.length +1 untuk menentukan ID.
user2576960
3
Waspadalah bahwa IE8 dan sebelumnya tidak mendukung beberapa fungsi.
BetaRide
Bisakah fungsi yang ditemukan dibuat menjadi IF? Sesuatu seperti: if (arr.some (function (el) {el.Id == someId) dan itu akan mengembalikan benar atau salah jika ada atau tidak?
stibay

@stibay, some tidak kembali boolean. foundakan menjadi trueatau falsetergantung pada apakah kondisi dalam panggilan balik terpenuhi.
Andy

1
Oh, pasti: if (arr.some(function (el) { return el.Id == someId; })) { // do something }. Jangan lupa itu returnatau Anda tidak akan mendapatkan apa pun kembali.
Andy

26

Agak sepele untuk memeriksa nama pengguna yang ada:

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

Tetapi tidak begitu jelas apa yang harus dilakukan ketika Anda harus menambahkan pengguna baru ke array ini. Jalan keluar termudah - hanya mendorong elemen baru yang idsama dengan 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

Ini akan menjamin keunikan ID, tetapi akan membuat array ini terlihat sedikit aneh jika beberapa elemen akan dihapus.


Terima kasih untuk ini. Saya pergi dengan solusi Andy pada akhirnya karena itu cara yang lebih ringkas untuk mencapai hal yang sama. Saya tidak akan menghapus pengguna pada titik mana pun sehingga ID harus tetap konsisten. Pemeriksaan memungkinkan pengguna untuk masuk, keluar dan kembali lagi tanpa array bertambah lembur. Hanya untuk info saya menggunakan fungsi ini dalam hubungannya dengan passport.js dan saya belum dapat menemukan cara menghapus pengguna dari array tanpa bermain dengan kode paspor itu sendiri. Solusi ini berfungsi dengan baik.
user2576960


10

Saya pikir, ini adalah cara terpendek untuk mengatasi masalah ini. Di sini saya telah menggunakan fungsi panah ES6 dengan .filter untuk memeriksa keberadaan nama pengguna yang baru ditambahkan.

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);

Tautan ke Fiddle


3

Inilah yang saya lakukan selain jawaban @ sagar-gavhane

const newUser = {_id: 4, name: 'Adam'}
const users = [{_id: 1, name: 'Fred'}, {_id: 2, name: 'Ted'}, {_id: 3, 'Bill'}]

const userExists = users.some(user => user.name = newUser.name);
if(userExists) {
    return new Error({error:'User exists'})
}
users.push(newUser)

Hai, Jika saya menemukan nilai, bagaimana saya bisa mengakses id?
Kusal Kithmal

Sangat mudah untuk melakukan itu... if(userExists) { const userId = userExists.id return userId; } ...
Michael Enitan

2

Jawaban yang diterima juga dapat ditulis dengan cara berikut menggunakan fungsi panah pada .some

 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 }); }
 }

1

Saya suka jawaban Andy, tetapi id tidak harus unik, jadi inilah yang saya buat untuk membuat ID unik juga. Dapat diperiksa di jsfiddle juga. Harap dicatat bahwa arr.length + 1mungkin tidak menjamin ID unik jika ada sesuatu yang telah dihapus sebelumnya.

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 };
}

Saya suka kesederhanaan dalam jawaban lain, saya hanya memposting milik saya untuk menambahkan cek untuk ID unik
Uxonith

Terima kasih atas jawaban Anda, Uxonith. Saat ini saya tidak memerlukan ID unik karena saya tidak akan menghapus pengguna dari array. Saya akan menyimpan resolusi ini di saku belakang saya jika perlu. Terima kasih lagi
user2576960

1

Anda dapat membuat prototipe array Anda untuk membuatnya lebih modular, coba sesuatu seperti ini

    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
    };

Dan Anda dapat menggunakannya sebagai:

 yourArray.hasElement(yourArrayElement)

1

Saya memang mencoba langkah-langkah di atas untuk beberapa alasan itu kelihatannya tidak bekerja untuk saya, tetapi ini adalah solusi terakhir saya untuk masalah saya sendiri mungkin hanya membantu untuk satu orang yang membaca ini:

let pst = post.likes.some( (like) => {  //console.log(like.user, req.user.id);
                                     if(like.user.toString() === req.user.id.toString()){
                                         return true
                                     } } )

di sini post.likes adalah susunan pengguna yang menyukai pos.


1

coba ini

Metode pertama menggunakan beberapa

  let arr = [{ id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 3, username: 'ted' }];
    let found = arr.some(ele => ele.username === 'bill');
    console.log(found)

Metode kedua menggunakan meliputi, peta

   let arr = [{ id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 3, username: 'ted' }];
    let mapped = arr.map(ele => ele.username);
    let found = mapped.includes('bill');
    console.log(found)

Bagaimana jika saya ingin membandingkan objek dengan 2 atribut seperti {"name": "test1", "age": 30}?
probitaille
1

Mari kita asumsikan kita memiliki array objek dan Anda ingin memeriksa apakah nilai nama didefinisikan seperti ini,

let persons = [ {"name" : "test1"},{"name": "test2"}];

if(persons.some(person => person.name == 'test1')) {
    ... here your code in case person.name is defined and available
}
Hasan Zahran
sumber
Harap tambahkan beberapa kalimat untuk menjelaskan apa yang sedang dilakukan kode Anda, sehingga Anda dapat memperoleh lebih banyak upvotes untuk jawaban Anda.
Fuzzy Analysis
Bagaimana jika saya ingin membandingkan objek dengan 2 atribut seperti {"name": "test1", "age": 30}?
probitaille
1

Berikut adalah rantai metode ES6 menggunakan .map()dan .includes():

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

const checkForUser = (newUsername) => {
      arr.map(user => {
        return user.username
      }).includes(newUsername)
    }

if (!checkForUser('fred')){
  // add fred
}
  1. Memetakan pengguna yang sudah ada untuk membuat berbagai string nama pengguna.
  2. Periksa apakah array nama pengguna itu menyertakan nama pengguna baru
  3. Jika tidak ada, tambahkan pengguna baru
Len Joseph
sumber
0

Fungsi asli array terkadang 3X - 5X kali lebih lambat dari loop normal. Plus fungsi asli tidak akan berfungsi di semua browser sehingga ada masalah kompatibilitas.

Kode Saya:

<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>

Dengan cara ini Anda dapat mencapai hasil lebih cepat.

Catatan: Saya belum memeriksa apakah parameter yang dikirimkan kosong atau tidak, jika mau, Anda dapat memberi tanda centang atau menulis ekspresi reguler untuk validasi tertentu.

Zaheen
sumber
0

xorWith di Lodash dapat digunakan untuk mencapai ini

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

function number_present_or_not () { var arr = [ 2,5,9,67,78,8,454,4,6,79,64,688 ] ; var found = 6; var found_two; untuk (i = 0; i

    }
    if ( found_two == found )
    {
        console.log("number present in the array");
    }
    else
    {
        console.log("number not present in the array");
    }
}
Nakkeeran 8797
sumber
-1

Praktik Terbaik adalah seperti ini.

var arr = ["a","b","c","d"];
console.log(arr.includes("a")); //---- true;
console.log(arr.includes("k")); //---- false;
console.log(arr.includes("c")); //---- true;
Hujan biru
sumber
18
Pertanyaannya adalah tentang berbagai objek dan ini tidak akan berhasil.
Adrian Enriquez
ini bukan jawaban yang tepat untuk pertanyaan itu.
Ahsan Mukhtar
jawaban ini tidak mencukupi persyaratan yang disebutkan dalam pertanyaan.
Savan Gadhiya