Mathematics
Mathematics

Reputation: 7628

Reducing objects properties to get new object

What I have,

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

What I want,

var newUsers = [{ FullName : "bring on - [email protected]",
                 value : S-12
               },
              { FullName : "bring on1 - [email protected]",
                 value : S-13
               }, // more users with same properties as abvove
              ];

What I tried but failed,

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

It needs to work on IE-8+ not sure what I am doing wrong really.

All I want is to reduce properties of object in array and get a new object.

Upvotes: 1

Views: 125

Answers (5)

LaVomit
LaVomit

Reputation: 492

Try the following:

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

Here is a fiddle for it. Check your console log for the outcome when you run the fiddle.

Upvotes: 2

kemiller2002
kemiller2002

Reputation: 115488

Your problem is that the .each function doesn't return anything. http://api.jquery.com/jquery.each/. It iterates over the collection of objects and performs and action on each one. This is different than the functional concept of the higher order function map, which is used to translate one collection into another. (JQuery has a map function too.)

To fix your problem you either need to do:

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,
    };
});

Personally, I would go with the second one, as it reduces the number of side effects in your code.

Edit: Apparently, map does not work in IE 8, so the top one is the more correct approach.

Upvotes: 3

Satpal
Satpal

Reputation: 133403

Array.prototype.map() can be used to create new array using Plain old Vanilla JavaScript.

The map() method creates a new array with the results of calling a provided function on every element in this array

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

Note: It will work with IE9+

Using jQuery.map()

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

Upvotes: 3

n1kkou
n1kkou

Reputation: 3142

Your object is an array of objects, so make use of Array map method:

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

Upvotes: 0

Muhammad Usman
Muhammad Usman

Reputation: 1362

try this!

var newArr= [];
$.each(users, function (index , user) {
    newArr.push({
       value : user.SID,
       FullName : user.firstname + " " + user.lastname + " - " + user.email,
    });
});

Upvotes: 0

Related Questions