清理方法来规范化Javascript对象属性

时间:2014-02-12 16:44:55

标签: javascript jquery

我有一组代表用户的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"
    }
]

更新 我本来应该更具体一点。我一直在寻找能够动态处理这种情况的选项,所以我不必提前了解这些属性。

对于jQuery特定的,$.extend()选项是一个很好的选项,但只有在提前了解所有属性时才会有效。

有些人提到这应该是服务器端的任务,虽然我通常同意这一点,但有两个原因我不在服务器端处理这个问题: 1)如果1000个对象中的900个仅包含可能的9个属性中的1个,那么它将是一个较小的JSON对象。 2)需要添加“空”属性以满足JS实用程序,该实用程序将来可以替换某些属性丢失时无关紧要的东西。

6 个答案:

答案 0 :(得分:4)

由于您使用的是jQuery,因此可以滥用$.extend

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

$.map([{}],Person)

更新

这是一种获得动态默认属性的方法

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 :(得分:2)

您可能尝试的是创建合并功能:

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

或者,如果您想放弃自定义以简化:

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

然后在分配变量时应用它:

var city = coalesceValues(obj.city);

这样你就不需要对数组和循环或任何东西进行任何疯狂的细分,你可以将它应用到你想要的任何东西,你也可以自定义你想要合并的值。

提供另一种想法。

答案 2 :(得分: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);
});

当然,这取决于一种特定类型的数据,并且不会扩展到其他属性,并且不会很干,但正如我所说,这可能是初学者最容易理解的数据&#39;的立场。

答案 3 :(得分: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/

答案 4 :(得分: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]] || '';
    }
}

答案 5 :(得分: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);