2013-04-11 8 views
3

다른 내가 다가 내 코드가 잘 있는지 알고 싶습니다, 내가하고 싶은에 : 그것을 만드는 존재하고 할당 할 경우 객체가 모범 사례 -

  • 존재

    1. 확인하는 경우 이 속성
    2. 이미 단지 특성

    을 할당 제가 지금 가지고있는 것은 다음과 코드,하지만 내가 쓰고 싶은 존재하지 않는 경우 두 번 같은 줄

    에게
    function doSomething(_whatever){ 
        if(typeof someobject === "undefined"){ 
         someobject = { //dont exist 
          profile : "some value", 
          status : [] 
         } 
    
         someobject.status.push(_whatever); 
        }else{ 
         someobject.status.push(_whatever); //because already exist 
        } 
    } 
    

    이 스 니펫을 작성하는 더 좋은 방법은 무엇입니까? 또는 더 좋고 덜 반복적으로 그것을합니까? 사전에

    감사

    ------ 본래의 기능

    function addPerson(_person){ 
        var people = Iee.dashboard.analytics.data.people.data;  
        if(typeof people[_person.Id_Emp] === "undefined"){ 
         people[_person.Id_Emp] = { 
          profile : _person, 
          status : [] 
         } 
    
         people[_person.Id_Emp].status.push({Id_Emp : _person.Id_Emp, status : _person.Estatus1, estatusby : _person.Centro_de_trabajo}); 
        }else{ 
         people[_person.Id_Emp].status.push({Id_Emp : _person.Id_Emp, status : _person.Estatus1, estatusby : _person.Centro_de_trabajo}); 
        } 
    
        addBlackList(_person); 
    } 
    
  • +0

    (당신의 문제를 해결하지만, 단지 제안하지 않기 위하여) - (_whatever) 귀하의'else' 제거하고'someobject.status.push를 넣어 ;''if '다음에. 무엇이든지 상관없이 실행되어야합니다. 왜 그 줄을 복제해야합니까? – Ian

    +0

    개체가 이미 있는지 여부를 알 수 없습니다. 따라서 코드가 해당 행을 실행하고 객체가 존재하지 않으면 객체가 정의되지 않았기 때문에 브라우저가 다운됩니다 ... – ncubica

    +2

    첫 번째 및 두 번째 코드 단편은 상당히 다릅니다. 처음에는 _object_의 존재를 확인하고, 두 번째 경우에는 객체 ('people')가 특정 _property_를 가지고 있는지 확인합니다. Javascript에는 특별히이 작업을 위해 [전용 연산자] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/in)가 있습니다. – georg

    답변

    4

    이 작업을 수행하는 일반적인 방법은 중복 검사입니다 :

    someobject = someobject || { 
        project:"some value", 
        status:[] 
    }; 
    
    +0

    그리고이 후에 값을 할당 할 수 있습니까? – ncubica

    +0

    물론입니다. 기본적으로 오브젝트가 존재하지 않으면 기본값을 사용하여 오브젝트를 작성합니다. –

    +0

    고마워요. .. upvote ... – ncubica

    4

    단순화 된 코드

    function addPerson(_person){ 
         var people = Iee.dashboard.analytics.data.people.data;  
         people[_person.Id_Emp] = people[_person.Id_Emp] || { 
           profile : _person, 
           status : [] 
          }; 
    
          people[_person.Id_Emp].status.push({Id_Emp : _person.Id_Emp, status : _person.Estatus1, estatusby : _person.Centro_de_trabajo}); 
    
         addBlackList(_person); 
        } 
    
    +0

    고마워요. 남자가 먼저 대답했기 때문에 @Kolink를 오른쪽으로 팔았어요. 하지만 둘 다 완전히 맞습니다 ... – ncubica

    1

    이 경우 은 객체이거나 정의되지 않은이지만 문자열, 숫자 등이 아니므로 진리 값이 있는지 확인할 수 있습니다. A (truthy) 값이 존재하지 않는 경우에만 변수에 값을 할당하므로

    function addPerson(_person) { 
        var people = Iee.dashboard.analytics.data.people.data, 
         person = people[_person.Id_Emp]; 
    
        if (!person) person = { 
         profile: _person, 
         status: [] 
        }; 
        person.status.push({ 
         Id_Emp: _person.Id_Emp, 
         status: _person.Estatus1, 
         estatusby: _person.Centro_de_trabajo 
        }); 
    
        addBlackList(_person); 
    } 
    

    는 다른 답변에서 언급 한 중복 검사보다 약간 더 나은 수행해야합니다.

    그냥 재미를 위해, 여기에 극도로 응축 버전입니다 :

    function addPerson(_person) { 
        var people = Iee.dashboard.analytics.data.people.data, id = _person.Id_Emp; 
    
        (people[id] || { profile: _person, status: [] }).status.push({ 
         Id_Emp: id, status: _person.Estatus1, estatusby: _person.Centro_de_trabajo 
        }); 
        addBlackList(_person); 
    } 
    
    +0

    cool !!! 이게 들리네.하지만 사람들이 처음에 정의되지 않았다면 브라우저가 망가지지 않을까? 분명히 성공하지 못하면 접근하려고 노력할 것입니다. – ncubica

    +0

    'a'와'b'가 정의되고 속성을 가질 수있는 한'a [b.c]'는'b.c'가 정의되어 있지 않아도 오류를 일으키지 않아야합니다. 그러므로'people''person이 객체라면 안전합니다. 콘솔에서 이것을 실행 해보십시오 :'var a = {}, b = {}; 경고 (a [b.c]); –