减少对象属性以获取新对象

时间:2015-08-28 06:25:16

标签: javascript jquery

我有什么,

var oldUsers = [{
    "SID": "S-12",
        "Username": "bring.on",
        "firstname": "bring",
        "lastname": "on",
        "email": "emasdklhsjas@gmnailasd.com"
    // and so on... 10 more properties
}, {
    "SID": "S-13",
        "Username": "bring.on1",
        "firstname": "bring",
        "lastname": "on1",
        "email": "sdf@gmnailasd.com"
    // and so on... 10 more properties
},
              // n numbers of more users...];

我想要的,

var newUsers = [{ FullName : "bring on - emasdklhsjas@gmnailasd.com",
                 value : S-12
               },
              { FullName : "bring on1 - sdf@gmnailasd.com",
                 value : S-13
               }, // more users with same properties as abvove
              ];

我尝试但失败了,

var newUsers = $.each(oldUser, function () {
    return u = {
        value : this.SID,
        FullName : this.firstname + " " + this.lastname + " - " + this.email,
    };
});

它需要在IE-8上工作+不确定我做错了什么。

我想要的只是减少数组中对象的属性并获得一个新对象。

5 个答案:

答案 0 :(得分:3)

Array.prototype.map()可用于使用Plain old Vanilla JavaScript创建新数组。

  

map()方法创建一个新数组,其结果是在此数组中的每个元素上调用提供的函数

var newUsers = oldUser.map(function(obj){
    return {
        value : obj.SID,
        FullName : obj.firstname + " " + obj.lastname + " - " + obj.email,
    }
});

注意:它适用于IE9 +

使用jQuery.map()

var newUsers = jQuery.map(oldUser, function(obj){
    return {
        value : obj.SID,
        FullName : obj.firstname + " " + obj.lastname + " - " + obj.email,
    }
});

答案 1 :(得分:3)

您的问题是.each函数没有返回任何内容。 http://api.jquery.com/jquery.each/。它迭代对象集合并对每个对象执行和操作。这与高阶函数映射的功能概念不同,后者用于将一个集合转换为另一个集合。 (JQuery有一个地图函数too。)

要解决您的问题,您需要执行以下操作:

var newArray = []
var newUsers = $.each(oldUser, function () {
    newArray.push ({
        value : this.SID,
        FullName : this.firstname + " " + this.lastname + " - " + this.email,
    });
});

or 

  var newArray = $.map(oldUsers, function (u,i) {
    return {
        value : this.SID,
        FullName : u.firstname + " " + u.lastname + " - " + u.email,
    };
});

就个人而言,我会选择第二个,因为它会减少代码中side effects的数量。

编辑:显然,地图在IE 8中不起作用,所以最重要的是更正确的方法。

答案 2 :(得分:2)

尝试以下方法:

var newUsers = [];
$.each(oldUser, function () {
    newUsers.push({
        value : this.SID,
        FullName : this.firstname + " " + this.lastname + " - " + this.email,
    });
});

Here is a fiddle for it。运行小提琴时,请检查控制台日志中的结果。

答案 3 :(得分:0)

试试这个!

.control-label {
  text-align:left!important;
}

答案 4 :(得分:0)

您的对象是一个对象数组,因此请使用数组映射方法:

var result = oldUsers.map(function(e){ return { Fullname : e.firstname + e.lastname, value : e['SID']}; });