2014-01-14 145 views
0

我有一個名爲grid.data的數組,它有一個assignedTo字段,在本例中它是一個Id值(25和26)。我還有另一個名爲userProfiles的數組,它具有一個id和一個名稱字段。我可以使用_lodash來更新另一個數據的數組嗎?

var grid.data = [ 
    {"cityId":9,"assignedTo":"25"}, 
    {"cityId":63,"assignedTo":"26"}]; 

var userProfiles = [ 
    {"id":"25","name":"john"}, 
    {"id":"26","name":"jacky"}]; 

我有以下功能:

var getUser = function (userId) { 
    if (userId && userProfiles) 
     for (var i = 0; i < userProfiles.length; i++) 
      if (userProfiles[i].id === userId) 
       return userProfiles[i].name; 
    return ''; 
} 

是否有可能對我來說,使用_lodash調用的getUser功能與 的assignedTo值與所返回的用戶名 更換assignedTo?或者(如果這是更好的方法),我可以將grid.data和$ scope.option.userProfiles與_lodash結合使用,並避免必須調用getUser?

這是輸出我需要:

var grid.newData = [ 
    {"cityId":9,"assignedTo":"john"}, 
    {"cityId":63,"assignedTo":"jacky"}]; 
+0

如果您發佈兩個數組這將是有益的,而所需的輸出。 – elclanrs

回答

1

你可以結合一個_.map_.where ....

grid.newData = _.map(grid.data, function(item) { 
    var profile = _.where(userProfiles, {id : item.assignedTo})[0]; 
    return { 
     cityId : item.cityId, 
     assignedTo : profile.name 
    } 
}); 
+0

如果'_.where(userProfiles,{id:item.assignedTo}).length'大於1,會發生什麼情況? – Maus

+0

OP詢問了lodash映射函數,並給出了一對一的例子。除非他/她說需要將'assignedTo'移動到'> 1'中的數組中,否則不需要提供該解決方案。 – borbulon

-3

你可以只用vanilla.js做到這一點:

var grid_data = [ 
    {"cityId":9,"assignedTo":"25"}, 
    {"cityId":63,"assignedTo":"26"}]; 

var userProfiles = [ 
    {"id":"25","name":"john"}, 
    {"id":"26","name":"jacky"}]; 

var output = [] 

// loop over the grid data and the user profiles. 
for(var o = 0, olen = grid_data.length; o < olen; ++o) { 
    for(var i = 0, ilen = userProfiles.length; i < ilen; ++i) { 

    // skip pairs that don't match. 
    if(grid_data[o].assignedTo !== userProfiles[i].id) { 
     continue 
    } 

    output.push({ 
     cityId: grid_data[o].cityId, 
     assignedTo: userProfiles[i].name 
    }) 
    } 
} 

console.log(output) 
// [ { cityId: 9, assignedTo: 'john' }, 
// { cityId: 63, assignedTo: 'jacky' } ] 

或者,如果您更喜歡更具功能的方法:

console.log(grid_data.map(join).reduce(flatten, [])) 

function join(city) { 
    return userProfiles.filter(matches).map(merge) 

    function merge(profile) { 
    return { 
     cityId: city.cityId, 
     assignedTo: profile.name 
    } 
    } 

    function matches(profile) { 
     return profile.id === city.assignedTo 
    } 

} 

function flatten(lhs, rhs) { 
    return lhs.concat(rhs) 
} 

最後lodash(擴大@ el_bob的答案)

var _ = require('lodash') 

console.log(_.flatten(_.map(grid_data, function(city) { 
    return _.map(_.where(userProfiles, {id : city.assignedTo}), merge) 

    function merge(profile) { 
    return { 
     cityId: city.cityId, 
     assignedTo: profile.name 
    } 
    } 
}))) 
+0

-1 ...如果用戶詢問如何在lodash中進行操作,即功能上,for循環超出範圍。 – djechlin

+0

lodash支持循環。 – Maus

+0

但我也會提供lodash示例。 – Maus

相關問題