用于规范化Javascript对象属性的Clean方法
我有一个表示用户的javascript对象数组,如下所示:用于规范化Javascript对象属性的Clean方法,javascript,jquery,Javascript,Jquery,我有一个表示用户的javascript对象数组,如下所示: [ { userName: "Michael", city: "Boston" }, { userName: "Thomas", state: "California", phone: "555-5555" }, { userName: "Kathrine", phone: "444-4444" } ] [ { userName: "Michael", ci
[
{ 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"
}
]
某些对象包含某些属性,但不包含其他属性。我需要的是一种干净的方法来确保所有对象都具有相同的属性。如果它们不存在,我希望它们有一个空字符串值,如下所示:
[
{ 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实用程序的要求,该实用程序可以在将来替换为不关心是否缺少某些属性的东西 var列表=[
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);
{用户名:“Michael”,
城市:“波士顿”
},
{用户名:“托马斯”,
州:“加利福尼亚”,
电话:“555-5555”
},
{用户名:“凯瑟琳”,
电话:“444-4444”
}
];
对于(变量i=0;i
您可以尝试创建聚合函数:
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);
这样,您就不需要对数组和循环或任何东西进行任何疯狂的分解,您可以将其应用于任何您想要的内容,还可以自定义要合并的值
只是提供了另一种想法。这可能是一项服务器端任务,但是 如果您提前知道所有可能的属性,您可以这样做:
最容易理解的方法可能是创建一个函数,该函数接受一个对象并使用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);
});
当然,这取决于一种特定类型的数据,不会扩展到其他属性,也不是很枯燥,但正如我所说的,从初学者的角度来看,这可能是最容易理解的。因为您使用的是jQuery,所以您可以滥用它 更新 下面是一种具有动态默认属性的方法
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"}]
*/
函数映射默认值(arr){
var defaultProperties={}
对于(var i=0;i
此函数在数组中存储唯一的对象键,因此您可以在数组中运行对象数组,然后使用其他提供的答案之一将键添加到不存在的对象中:
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);
你有没有尝试过?+1尝试过任何东西,但是。。。为什么不能在检索数据时清理数据呢?这里有一个建设性的建议:在项目上创建一个预期属性的默认对象:
{user:,city:,…}
然后调用$。map
并使用默认值扩展每个项目mapDefaults
也可以不使用jQuery:mapdaults(arr){var defaultProperties={}for(var i=0;i