2014-02-12 3 views
3

У меня есть массив яваскрипта объектов, представляющих пользователей, например, так:Clean Метод Нормализация свойств объекта Javascript

[ 
    { userName: "Michael", 
    city: "Boston" 
    }, 
    { userName: "Thomas", 
    state: "California", 
    phone: "555-5555" 
    }, 
    { userName: "Kathrine", 
    phone: "444-4444" 
    } 
] 

Некоторые объекты содержат некоторые другие свойства, но не так. Мне нужен чистый способ обеспечить, чтобы ВСЕ объекты получали одни и те же свойства. Если они не существуют, я хочу, чтобы иметь пустое значение строки, например:

[ 
    { userName: "Michael", 
     city: "Boston", 
     state: "", 
     phone: "" 
    }, 
    { userName: "Thomas", 
     city: "", 
     state: "California", 
     phone: "555-5555" 
    }, 
    { userName: "Kathrine", 
     city: "", 
     state: "", 
     phone: "444-4444" 
    } 
] 

Update я должен был быть немного более конкретными. Я искал вариант, который будет обрабатывать эту ситуацию динамически, поэтому мне не нужно знать свойства раньше времени.

Для конкретного jQuery параметр $.extend() является хорошим, но будет работать, только если вы знаете ВСЕ свойства раньше времени.

Некоторые упомянули, что это, вероятно, должно быть задачей на стороне сервера, и, хотя я обычно согласен с этим, есть две причины, по которым я не обрабатываю это на стороне сервера: 1) это будет меньший объект JSON, если, скажем, 900 из 1000 объектов содержат только 1 из возможных 9 свойств. 2) необходимо добавить «пустые» свойства, чтобы удовлетворить утилиту JS, которую можно заменить в будущем тем, что не имеет значения, если некоторые свойства отсутствуют.

+2

вы сделали попытку? – megawac

+1

+1 на самом деле пытается что-нибудь, но также ... почему вы не можете просто очистить данные при их получении? – PlantTheIdea

+1

Любое конструктивное предложение о том, как это сделать: создать объект объекта по умолчанию для вашего объекта: '{user:" ", city:" ", ...}', затем вызвать '.map' и расширить каждый элемент по умолчанию – megawac

ответ

3

Поскольку вы используете JQuery вы можете злоупотреблять $.extend

function Person(options){ 
    return $.extend({ 
     userName:"", 
     city: "", 
     state:"", 
     phone: "" 
    },options); 
} 

$.map([{}],Person) 

обновление

Heres способ иметь динамические свойства по умолчанию

function mapDefaults(arr){ 
    var defaultProperties = {} 
    for(var i =0; i < arr.length; i++){ 
     $.each(arr[i],function(key){ 
      defaultProperties[key] = ""; 
     }); 
    } 
    function Defaulter(obj){ 
     return $.extend({},defaultProperties,obj); 
    } 
    return $.map(arr, Defaulter); 
} 

mapDefaults([{a:"valA"},{b:"valB"}]); 
/* produces: 
[{a:"valA",b:""},{a:"",b:"valB"}] 
*/ 
1
var list = [ 
    { userName: "Michael", 
    city: "Boston" 
    }, 
    { userName: "Thomas", 
    state: "California", 
    phone: "555-5555" 
    }, 
    { userName: "Kathrine", 
    phone: "444-4444" 
    } 
]; 


for(var i = 0; i < list.length; i++){ 
    if(list[i].state === undefined) 
     list[i].state = ""; 
    if(list[i].phone === undefined) 
     list[i].phone = ""; 
}; 
console.log(list); 

http://jsfiddle.net/g5XPk/1/

2

Что-то вы можете попробовать создает функцию коалесцирующий:

function coalesceValues(val){ 
    switch(val) 
     case undefined: 
     case null: 
      return ''; 
      break; 
     default: 
      return val; 
      break; 
    } 
} 

Или, если вы хотите отказаться от настройки для простоты:

function coalesceValues(val){ 
    return val || ''; 
} 

А затем применить его при назначении переменных:

Таким образом, вам не нужно делать какие-либо сумасшедшие пробоины для массива и цикла или чего-то еще, вы можете применить его к тому, что хотите, а также можете настроить значения, которые вы хотите объединить.

Просто предлагая альтернативную идею.

0

Это, вероятно, будет задача на стороне сервера, но ..

Если вы знаете все возможные свойства впереди времени, вы можете сделать это:

http://jsfiddle.net/BMau9/

var properties = ['userName', 'city', 'state', 'phone']; 

var data = [{ 
    userName: "Michael", 
    city: "Boston" 
}, { 
    userName: "Thomas", 
    state: "California", 
    phone: "555-5555" 
}, { 
    userName: "Kathrine", 
    phone: "444-4444" 
}]; 

for (var i in data) { 
    for (var j in properties) { 
     data[i][properties[j]] = data[i][properties[j]] || ''; 
    } 
} 
2

путь, который легче всего понять, вероятно, заключается в создании функции, которая принимает объект и использует операторы if как проверки существования, присваивая значение по умолчанию, если оно не находит его.

function normalize(object) { 
    if(typeof object.userName === 'undefined') { 
    object.userName = 'Default Value'; 
    } 
    if(typeof object.city === 'undefined') { 
    object.city = 'Default Value'; 
    } 
    if(typeof object.state === 'undefined') { 
    object.state = 'Default Value'; 
    } 
    if(typeof object.phone === 'undefined') { 
    object.phone = 'Default Value'; 
    } 

    return object; 

} 

var userArray = [{},{},{}].map(normalize); 

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

function User (data) { 
    this.userName = data.userName || 'Default Value'; 
    this.city = data.city || 'Default Value'; 
    this.state = data.state || 'Default Value'; 
    this.phone = data.phone || 'Default Value'; 

return this; 
} 

var userArray = [{},{},{}].map(function(o){ 
return new User(o); 
}); 

Конечно, это зависит от конкретного типа данных и не будет распространяться на другие свойства и не очень DRY, но, как я сказал, это, вероятно, легче всего понять с точки зрения новичка.

0

Fiddle Эта функция сохраняет ключи уникальный объект в массиве, и вы можете запускать луч объектов через него, а затем использовать один из других поставляемых ответов добавить ключи к объектам, если они не существуют:

function uniqueKeys(){ 
    var keys=[]; 
    function getUniqueKeys(){ 
     return keys 
    } 
    function addObject(obj){ 
     for (var k in obj){ 
      keys = _.union(keys,[k]); 
     } 
    } 
    return { 
     addObj: addObject, 
     getKeys: getUniqueKeys 
    } 
} 

Использования:

var objArr = [{ userName: "Michael", city: "Boston" }, 
{ userName: "Thomas", state: "California", phone: "555-5555"}, 
{ userName: "Kathrine",phone: "444-4444" }]; 

var uniq = new uniqueKeys(); 
_.each(objArr, function(v){ 
    uniq.addObj(v) 
}); 
var keys = uniq.getKeys(); 
alert(keys); 
Смежные вопросы