Kiểm tra xem giá trị đối tượng có tồn tại trong một mảng đối tượng Javascript hay không và nếu không thêm đối tượng mới vào mảng


146

Nếu tôi có mảng đối tượng sau:

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

Có cách nào để lặp qua mảng để kiểm tra xem một giá trị tên người dùng cụ thể đã tồn tại chưa và nếu nó không làm gì, nhưng nếu nó không thêm một đối tượng mới vào mảng với tên người dùng đã nói (và ID mới)?

Cảm ơn!


1
Bill và Ted có phải có cùng một ID không?
user2357112 hỗ trợ Monica

Tại sao có hai yếu tố giống nhau id? Có thể là các phần tử sẽ bị xóa khỏi mảng này, hoặc chúng ta có thể chắc chắn rằng phần tử mới sẽ luôn luôn idbằng arr.length + 1?
raina77ow

Nếu bạn không muốn lặp qua nó, hãy kiểm tra Hỏi & Đáp này để mở rộng nguyên mẫu mảng, stackoverflow.com/questions/1988349/ .
Cem Özer

các chức năng gốc chậm hơn so với các vòng lặp thông thường và sự hỗ trợ của chúng bị giới hạn ở một số phiên bản trình duyệt. kiểm tra câu trả lời của tôi dưới đây
Zaheen

đây là một câu hỏi sai về cơ bản bởi vì bạn có thể làm điều đó bằng cách tránh sử dụng Mảng.
Bekim Bacaj

Câu trả lời:


234

Tôi đã cho rằng đó idlà duy nhất ở đây. somelà một chức năng tuyệt vời để kiểm tra sự tồn tại của các thứ trong mảng:

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


1
Cảm ơn Andy đây là một giải pháp rất sạch cho vấn đề và đang hoạt động rất tốt. Tôi đã không bắt gặp một số phương pháp trước đây. Giả định của bạn là chính xác, ví dụ ID của tôi chỉ là một lỗi đánh máy, tôi đã sử dụng Array.length + 1 để xác định ID.
user2576960

3
Coi chừng IE8 trở về trước không hỗ trợ chức năng nào đó.
BetaRide

Hàm tìm thấy có thể được tạo thành IF không? Một cái gì đó như: if (Array.some (function (el) {el.Id == someId) và nó sẽ trả về đúng hoặc sai nếu nó tồn tại hay không?
stibay

@stibay, some không trả về một boolean. foundsẽ hoặc truehoặc falsetùy thuộc vào điều kiện trong cuộc gọi lại được đáp ứng.
Andy

1
Ồ, chắc chắn rồi : if (arr.some(function (el) { return el.Id == someId; })) { // do something }. Đừng quên điều đó returnhoặc bạn sẽ không nhận lại được bất cứ điều gì.
Andy

26

Việc kiểm tra tên người dùng hiện tại khá đơn giản:

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

Nhưng không rõ ràng phải làm gì khi bạn phải thêm người dùng mới vào mảng này. Cách dễ nhất - chỉ cần đẩy một phần tử mới idbằng 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

Nó sẽ đảm bảo tính duy nhất của ID, nhưng sẽ làm cho mảng này trông hơi lạ nếu một số phần tử sẽ bị loại bỏ.


Cảm ơn vì điều đó. Cuối cùng tôi đã đi đến giải pháp của Andy vì đó là cách ngắn gọn hơn để đạt được điều tương tự. Tôi sẽ không xóa người dùng tại bất kỳ thời điểm nào để ID phải nhất quán. Kiểm tra cho phép người dùng đăng nhập, đăng xuất và đăng nhập lại mà không cần mảng tăng thêm giờ. Chỉ để biết thông tin Tôi đang sử dụng chức năng này kết hợp với Passport.js và tôi chưa thể tìm cách xóa người dùng khỏi mảng mà không cần chơi với chính mã hộ chiếu. Giải pháp này hoạt động độc đáo.
user2576960


10

Tôi nghĩ rằng, đây là cách ngắn nhất để giải quyết vấn đề này. Ở đây tôi đã sử dụng chức năng mũi tên ES6 với .filter để kiểm tra sự tồn tại của tên người dùng mới thêm.

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

Liên kết đến Fiddle


3

Đây là những gì tôi đã làm ngoài câu trả lời của @ 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)

Xin chào, Nếu tôi tìm thấy giá trị, làm thế nào tôi có thể truy cập id?
Kusal Kithmal

Thật đơn giản để làm điều đó... if(userExists) { const userId = userExists.id return userId; } ...
Michael Enitan

2

Câu trả lời được chấp nhận cũng có thể được viết theo cách sau bằng cách sử dụng chức năng mũi tên trên .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

Tôi thích câu trả lời của Andy, nhưng id không nhất thiết phải là duy nhất, vì vậy đây là những gì tôi nghĩ ra để tạo một ID duy nhất. Có thể được kiểm tra tại jsfiddle quá. Xin lưu ý rằng arr.length + 1rất có thể không đảm bảo một ID duy nhất nếu bất kỳ thứ gì đã bị xóa trước đó.

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

Tôi thích sự đơn giản trong các câu trả lời khác, tôi chỉ đăng của tôi để thêm kiểm tra ID duy nhất
Uxonith

Cảm ơn câu trả lời của bạn Uxonith. Hiện tại tôi không có nhu cầu về ID duy nhất vì tôi sẽ không xóa người dùng khỏi mảng. Tôi sẽ giữ độ phân giải này trong túi sau của mình trong trường hợp có nhu cầu. Cảm ơn một lần nữa
user2576960

1

Bạn có thể tạo nguyên mẫu cho mảng của mình để làm cho nó trở nên mô đun hơn, hãy thử một cái gì đó như thế này

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

Và bạn có thể sử dụng nó như:

 yourArray.hasElement(yourArrayElement)

1

Tôi đã thử các bước trên vì một số lý do khiến nó không hoạt động với tôi nhưng đây là giải pháp cuối cùng cho vấn đề của riêng tôi chỉ có thể hữu ích cho bất kỳ ai đọc điều này:

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

ở đây post.like là một loạt người dùng thích một bài đăng.


1

thử cái này

phương pháp đầu tiên sử dụng một số

  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)

phương pháp thứ hai sử dụng bao gồm, bản đồ

   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)

Nếu tôi muốn so sánh các đối tượng với 2 thuộc tính như {"name": "test1", "age": 30} thì sao?
probitaille

1

Giả sử chúng ta có một mảng các đối tượng và bạn muốn kiểm tra xem giá trị của tên có được định nghĩa như thế này không,

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

if(persons.some(person => person.name == 'test1')) {
    ... here your code in case person.name is defined and available
}

Vui lòng thêm một vài câu để giải thích mã của bạn đang làm gì, để bạn có thể nhận được nhiều thông báo hơn cho câu trả lời của mình.
Phân tích mờ

Nếu tôi muốn so sánh các đối tượng với 2 thuộc tính như {"name": "test1", "age": 30} thì sao?
probitaille

1

Đây là chuỗi phương thức ES6 sử dụng .map().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. Ánh xạ qua người dùng hiện tại để tạo mảng chuỗi tên người dùng.
  2. Kiểm tra xem mảng tên người dùng đó có bao gồm tên người dùng mới không
  3. Nếu nó không có mặt, hãy thêm người dùng mới

0

Các hàm riêng của mảng đôi khi chậm hơn 3 lần - 5 lần so với các vòng lặp thông thường. Cộng với các chức năng gốc sẽ không hoạt động trong tất cả các trình duyệt nên có vấn đề tương thích.

Mã của tôi:

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

Bằng cách này bạn có thể đạt được kết quả nhanh hơn.

Lưu ý: Tôi chưa kiểm tra xem tham số có bị trống hay không, nếu bạn muốn, bạn có thể đặt kiểm tra trên đó hoặc viết biểu thức chính quy để xác thực cụ thể.


0

xorWith trong Lodash có thể được sử dụng để đạt được điều này

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

hàm number_present_or_not () { var arr = [ 2,5,9,67,78,8,454,4,6,79,64,688 ] ; var Found = 6; var Found_two; cho (i = 0; i

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

-1

Thực hành tốt nhất là như thế này.

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

18
Câu hỏi là về mảng các đối tượng và điều này sẽ không hoạt động.
Adrian Enriquez

đây không phải là câu trả lời cho câu hỏi
Ahsan Mukhtar

câu trả lời này không đủ yêu cầu được đề cập trong câu hỏi.
Savan Gadhiya
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.