2013-04-11 2 views
3

Я хотел бы знать, если мой код приближается хорошо, я хотел бы:Лучшая практика, когда объект не определен, если - еще

  1. Проверить, если объект существует
  2. Если не существует создать его и назначить это свойство
  3. Если уже существую просто присвоить свойства

, что у меня сейчас есть код следовать, но я не люблю писать два раз в ту же строку

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

(не исправить вашу проблему, но только предложение) - Удалить файл 'else' и положить' someobject.status.push (_whatever) ; 'сразу после' if'. Он должен быть выполнен независимо от того, зачем дублировать эту строку? – Ian

+0

Вы не знаете, существует ли объект. Поэтому, если код выполняет эту строку и объект не существует, это приведет к сбою браузера, потому что объект не определен ... – ncubica

+2

Обратите внимание, что ваш первый и второй фрагменты совершенно разные. В первом вы проверяете существование _объекта_, во втором - если объект ('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

В этом случае вы ожидайте, что это либо объект, либо неопределенный, но не строка, число и т. Д., Поэтому вы можете просто проверить, имеет ли оно правдивое значение.

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

Это должно выполнять несколько лучше, чем избыточной проверки упомянутых в других ответов, так как это будет только присвоить значение переменной, если (truthy) значение не присутствует.

Просто для удовольствия, здесь ультра-конденсированной версия:

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 !!! это звучит лучше ... Но что происходит, если люди [_person.Id_Emp] не определены вначале, не разрушит браузер? Я имею в виду попытаться получить доступ, очевидно, с неуспехом. – ncubica

+0

Пока 'a' и' b' определены и могут иметь свойства, 'a [b.c]' не должно вызывать ошибку, даже если 'b.c' не определен. Таким образом, это безопасно, если 'people'' _person' являются объектами. Попробуйте запустить это в консоли: 'var a = {}, b = {}; оповещение (а [b.c]); ' –

Смежные вопросы