使用Lodash或Angular过滤一个JSON属性

时间:2015-05-28 19:19:52

标签: json lodash

我正在寻找最快,最优雅的方式来做到这一点。我已经看到了类似的问题,他们都非常具体地解决问题。我对Lodash很新,而且我主要使用_.find。我不知道如何使用_.filter来获得我想要的东西,一个只有过滤后的返回的新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服务进行过滤。要过滤掉的值只是“代码”,我从webservice收到的字符串是用逗号分隔的字符串。

$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"}]

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:1)

使用lodash _.filter _.includes的优雅解决方案:

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

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

答案 2 :(得分:0)

最快的是@ softvar的解决方案。 如果您正在寻找优雅,可能就是这样:

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