객체 값이 객체의 자바 스크립트 배열 내에 존재하는지와 배열에 새 객체를 추가하지 않는지 확인하십시오


147

다음과 같은 객체 배열이있는 경우 :

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

특정 사용자 이름 값이 이미 존재하는지 여부와 아무것도하지 않는지 확인하기 위해 배열을 반복하는 방법이 있습니까?하지만 해당 사용자 이름 (및 새 ID)으로 배열에 새 객체를 추가하지 않는 경우?

감사!


1
Bill과 Ted의 ID가 같아야합니까?
user2357112는

왜 같은 두 개의 요소가 id있습니까? 이 배열에서 요소가 제거 될 수 있습니까? 아니면 새 요소가 항상 idarr.length + 1습니까?
raina77ow

반복하지 않으려면 배열 프로토 타입, stackoverflow.com/questions/1988349/… 확장에 대한이 Q & A를 확인하십시오 .
Cem Özer

기본 기능은 일반 루프에 비해 느리고 지원은 일부 브라우저 버전으로 제한됩니다. 아래에서 내 대답을 확인하십시오.
Zaheen

이것은 배열의 사용을 피함으로써 그렇게 할 수 있기 때문에 근본적으로 잘못된 질문입니다.
Bekim Bacaj

답변:


234

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


1
고맙습니다 Andy 이것은 문제에 대한 매우 깨끗한 해결책이며 잘 작동합니다. 나는 전에 몇 가지 방법을 보지 못했습니다. 내 ID 예제가 오타 일 뿐이라고 가정했습니다 .arr.length + 1을 사용하여 ID를 결정했습니다.
user2576960

3
IE8 및 이전 버전은 일부 기능을 지원하지 않습니다.
BetaRide

찾은 기능을 IF로 만들 수 있습니까? if (arr.some (function (el) {el.Id == someId) 그리고 존재 여부에 관계없이 true 또는 false를 반환합니까?
stibay

@stibay, some 않습니다 부울을 반환합니다. found이 될 것입니다 true또는 false콜백의 조건이 충족되는지 여부에 따라 달라집니다.
Andy

1
아, 물론 : if (arr.some(function (el) { return el.Id == someId; })) { // do something }. 잊지 마십시오 return. 다시는 아무것도 얻지 못할 것입니다.
Andy

26

기존 사용자 이름을 확인하는 것은 쉽지 않습니다.

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 고유성을 보장하지만 일부 요소가 끝날 경우이 배열을 조금 이상하게 보입니다.


고마워 Andy의 솔루션과 함께갔습니다. 왜냐하면 동일한 것을 달성하는 더 간결한 방법이기 때문입니다. 어떤 시점에서도 사용자를 제거하지 않으므로 ID는 일관성을 유지해야합니다. 이 검사를 통해 사용자는 어레이의 초과 근무 증가없이 로그인, 로그 아웃 및 다시 로그인 할 수 있습니다. 정보를 위해 passport.js와 함께이 기능을 사용하고 있으며 여권 코드 자체를 사용하지 않고 배열에서 사용자를 제거하는 방법을 찾지 못했습니다. 이 솔루션은 훌륭하게 작동합니다.
user2576960


10

이것이이 문제를 해결하는 가장 짧은 방법이라고 생각합니다. 여기에서는 .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);

피들 링크


3

이것은 @ 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)

안녕하세요, 값을 찾으면 어떻게 ID에 액세스 할 수 있습니까?
Kusal Kithmal

정말 간단합니다... if(userExists) { const userId = userExists.id return userId; } ...
Michael Enitan

2

허용되는 답변은 다음의 화살표 기능을 사용하여 다음과 같이 작성할 수도 있습니다.

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

2

다음은 .map()and를 사용하는 ES6 메소드 체인입니다 .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. 기존 사용자를 매핑하여 사용자 이름 문자열 배열을 만듭니다.
  2. 해당 사용자 이름 배열에 새로운 사용자 이름이 포함되어 있는지 확인
  3. 존재하지 않으면 새 사용자를 추가하십시오.

1

앤디의 답변이 마음에 들지만 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 };
}

나는 다른 답변의 단순함을 좋아합니다. 방금 고유 ID 확인을 추가하기 위해 내 게시물을 게시했습니다
Uxonith

귀하의 답변 Uxonith에 감사드립니다. 현재는 어레이에서 사용자를 제거하지 않기 때문에 고유 ID가 필요하지 않습니다. 필요에 따라이 해결 방법을 백 포켓에 보관합니다. 다시 감사합니다
user2576960

1

배열을 더 모듈화하기 위해 프로토 타입을 만들 수 있습니다.

    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)

1

나는 어떤 이유로 든 나를 위해 일하지 않는 이음새를 시도했지만 이것이 내 자신의 문제에 대한 나의 최종 해결책이었다.

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

여기 post.likes는 게시물을 좋아하는 사용자의 배열입니다.


1

이 시도

일부를 사용하는 첫 번째 방법

  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)

include, map을 사용한 두 번째 방법

   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)

{ "name": "test1", "age": 30}과 같은 2 가지 속성을 가진 객체를 비교하려면 어떻게해야합니까?
probitaille

1

객체 배열이 있고 name 값이 다음과 같이 정의되어 있는지 확인하고 싶다고 가정 해 봅시다.

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

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

코드가하는 일을 설명하기 위해 몇 문장을 추가하여 답변에 대한 더 많은 투표를 얻을 수 있습니다.
퍼지 분석

{ "name": "test1", "age": 30}과 같은 2 가지 속성을 가진 객체를 비교하려면 어떻게해야합니까?
probitaille

0

배열의 기본 함수는 때때로 일반 루프보다 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

xorWith Lodash에서 이것을 달성하는 데 사용할 수 있습니다

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

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

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

-1

모범 사례는 다음과 같습니다.

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
문제는 객체 배열에 관한 것이며 작동하지 않습니다.
Adrian Enriquez

이것은 질문에 대한 답이 아닙니다.
Ahsan Mukhtar

이 답변은 질문에 언급 된 요구 사항으로 충분하지 않습니다.
사반 Gadhiya
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.