2015-05-28 63 views
0

我正在尋找最快和最優雅的方式來執行此操作。我看到類似的問題,他們都是非常具體的問題。我對Lodash相當陌生,而且我大多使用_.find。我不知道如何使用_.filter得到我想要的東西,一個新的JSON數組只用過濾的回報:使用Lodash或Angular過濾另一個JSON屬性

的陣列我從過濾:

var mod1 = [{"Codigo" : "001", "Valor" : "Rojo"}, 
       {"Codigo" : "002", "Valor" : "Blue"}, 
       {"Codigo" : "003", "Valor" : "Grey"}, 
       {"Codigo" : "004", "Valor" : "Green"}, 
       {"Codigo" : "005", "Valor" : "Pink"}, 
       {"Codigo" : "006", "Valor" : "Gold"}, 
       {"Codigo" : "007", "Valor" : "Black"}, 
       {"Codigo" : "008", "Valor" : "White"}, 
       {"Codigo" : "009", "Valor" : "Magenta"}, 
       {"Codigo" : "010", "Valor" : "Marine Blue"}, 
       {"Codigo" : "011", "Valor" : "Orange"}]; 

我的功能在控制器,prod是單個產品的JSON,其中包含5個修改器。像上面這樣的每個修飾符的完整列表存儲在本地,而另一個接收到通過web服務進行過濾。要過濾的值只是「代碼」,而我從Web服務接收到的字符串是用逗號分隔的字符串。

$scope.mod11 = Productos.getMod1(prod.mod1); 

我居然收到看起來像這樣來篩選:

"mod1":"001, 002, 005" 

這是我在過濾可怕的嘗試:

getMod1: function(mods) { 
      return _.filter(mod1, angular.fromJson(mods)); 
      /*return mod1;*/ 
     } 

我已經試過了幾個不同的方法,包括對mod進行拆分(',)。我只需要將字符串中的所有Codigo ==帶回任何值。

編輯:最後的結果,我希望在這個特殊的情況下看起來像這樣爲$ scope.mod11

[{"Codigo" : "001", "Valor" : "Rojo"}, 
{"Codigo" : "002", "Valor" : "Blue"}, 
{"Codigo" : "005", "Valor" : "Pink"}] 
+0

最終結果應該是什麼? – softvar

+0

scope.mod11的最終結果應該是= [{「Codigo」:「001」,「Valor」:「Rojo」},{「Codigo」:「002」,「Valor」:「Blue」},{「Codigo 「:」005「,」Valor「:」Pink「}]。 – mitbanip

回答

1

使用lodash的優雅解決方案 _.filter _.includes

var codes = "001, 002, 005".split(', '); 

getMod1: function(){ 
    return _.filter(mod1, function(c){ 
     return _.includes(codes, c.Codigo); 
    }) 
} 
+0

解決同一問題的兩個很好的答案。非常感謝你。 – mitbanip

+0

正如任何人在將來看到這一張紙條,如果你想有一個完整的答案你必須採取任何可能的空間從字符串第一: \t \t \t \t VAR陣列= mods.replace(/ \ s + /克, '')。分裂(','); – mitbanip

1

按我的理解:

var mod1 = [{"Codigo" : "001", "Valor" : "Rojo"}, 
       {"Codigo" : "002", "Valor" : "Blue"}, 
       {"Codigo" : "003", "Valor" : "Grey"}, 
       {"Codigo" : "004", "Valor" : "Green"}, 
       {"Codigo" : "005", "Valor" : "Pink"}, 
       {"Codigo" : "006", "Valor" : "Gold"}, 
       {"Codigo" : "007", "Valor" : "Black"}, 
       {"Codigo" : "008", "Valor" : "White"}, 
       {"Codigo" : "009", "Valor" : "Magenta"}, 
       {"Codigo" : "010", "Valor" : "Marine Blue"}, 
       {"Codigo" : "011", "Valor" : "Orange"}]; 

var response = {mod1: "001, 002, 005"}; 
var keys = response.mod1.split(', '); 
var arr =[]; 
for(var i=0;i<mod1.length;i++){ 
    if (keys.indexOf(mod1[i].Codigo) > -1) { 
    arr.push(mod1[i]) 
    } 
} 
console.log(arr) 

輸出:

Run in console. 
+0

我的歉意。我編輯了我的帖子以指定我正在查找的輸出。 – mitbanip

+0

看到我更新的答案,而不使用Lodash,它簡單而優雅。 – softvar

0

最快是@ softvar的解決方案。 如果您正在尋找優雅,可能是這樣的:

var codes = "001, 002, 005".split(', '); 
var mods = _(mod1).indexBy("Codigo").pick(codes).values().value();