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

使用Lodash或Angular过滤一个JSON属性与另一个JSON属性,json,lodash,Json,Lodash,我正在寻找最快和最优雅的方式来做到这一点。我见过有人问过类似的问题,它们都是针对某个问题的。我对Lodash相当陌生,我大部分时间都在使用。我不知道如何使用u.filter来获得我想要的,一个新的JSON数组,只包含过滤后的返回: 从中筛选的阵列: var mod1 = [{"Codigo" : "001", "Valor" : "Rojo"}, {"Codigo" : "002", "Valor" : "Blue"}, {"Cod

我正在寻找最快和最优雅的方式来做到这一点。我见过有人问过类似的问题,它们都是针对某个问题的。我对Lodash相当陌生,我大部分时间都在使用。我不知道如何使用u.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服务进行过滤。要过滤掉的值只是“代码”,我从Web服务接收到的字符串是一个用逗号分隔的字符串

$scope.mod11 = Productos.getMod1(prod.mod1);
我实际收到的要过滤的内容如下所示:

"mod1":"001, 002, 005"
这是我在过滤方面的可怕尝试:

getMod1: function(mods) {
            return _.filter(mod1, angular.fromJson(mods));
            /*return mod1;*/
        }
我尝试了几种不同的方法,包括在mods上进行拆分(',)。我只需要返回字符串中所有的Codigo==值

编辑:我在这个特定案例中寻找的最终结果是$scope.mod11看起来像这样

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

据我了解:

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)

使用lodash和:


最快的是@softvar的解决方案。 如果你想要优雅,可能是:

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

最终结果应该是什么?scope.mod11中的最终结果应该是=[{“Codigo”:“001”,“Valor”:“Rojo”},{“Codigo”:“002”,“Valor”:“Blue”},{“Codigo”:“005”,“Valor”:“Pink”}]在这种情况下。我道歉。我编辑了我的帖子以指定我要查找的输出。查看我的更新答案而不使用Lodash,它简单而优雅。两个很好的答案解决了相同的问题。非常感谢你们两位。作为对将来看到这一点的任何人的提醒,如果你想要一个完整的答案,你必须首先从字符串中取任何可能的空格:var array=mods.replace(/\s+/g')。split(',');
var codes = "001, 002, 005".split(', ');

getMod1: function(){
    return _.filter(mod1, function(c){
        return _.includes(codes, c.Codigo);
    })
}
var codes = "001, 002, 005".split(', ');
var mods = _(mod1).indexBy("Codigo").pick(codes).values().value();