用于规范化Javascript对象属性的Clean方法

用于规范化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

我有一个表示用户的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"
    }
]
某些对象包含某些属性,但不包含其他属性。我需要的是一种干净的方法来确保所有对象都具有相同的属性。如果它们不存在,我希望它们有一个空字符串值,如下所示:

[
  { 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