标准化Javascript对象属性的Clean方法

sea*_*yer 5 javascript jquery

我有一个代表用户的javascript对象数组,如下所示:

[
  { userName: "Michael",
    city: "Boston"
  },
  { userName: "Thomas",
    state: "California",
    phone: "555-5555"
  },
  { userName: "Kathrine",
    phone: "444-4444"
  }
]
Run Code Online (Sandbox Code Playgroud)

一些对象包含某些属性,但不包含其他属性。我需要一种干净的方法来确保所有对象都具有相同的属性。如果它们不存在,我希望它们具有一个空字符串值,如下所示:

 [
    { userName: "Michael",
      city: "Boston",
      state: "",
      phone: ""
    },
    { userName: "Thomas",
      city: "",
      state: "California",
      phone: "555-5555"
    },
    { userName: "Kathrine",
      city: "",
      state: "",
      phone: "444-4444"
    }
]
Run Code Online (Sandbox Code Playgroud)

更新 我应该更具体一些。我一直在寻找可以动态处理这种情况的选项,因此不必提前知道属性。

对于特定于jQuery的$.extend()选项是一个不错的选择,但只有在您提前知道所有属性的情况下才起作用。

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

Pro*_*man 5

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

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

$.map([{}],Person)
Run Code Online (Sandbox Code Playgroud)

更新

这是具有动态默认属性的方法

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"}]
*/
Run Code Online (Sandbox Code Playgroud)