猿问

如何匹配对象的多个属性

我可以很容易地匹配一个属性


var peoples = [

  { "name": "bob", "dinner": "pizza" },

  { "name": "john", "dinner": "sushi" },

  { "name": "larry", "dinner": "hummus" },

  { "name": "john", "dinner": "pie" }

];


$.each(peoples, function(i, val) {

    $.each(val, function(key, name) {

        if (name === "john")

            console.log(key + " : " + name);

       });

});

但是由于有 2 个 john,我如何匹配一个特定的(例如,喜欢寿司的 john)然后返回整个匹配的对象(在 json 中)?我尝试在 if 语句中添加另一个条件,但这似乎不起作用。


谢谢


皈依舞
浏览 198回答 5
5回答

qq_遁去的一_1

你可以find用来检查完全匹配var peoples = [  { "name": "bob", "dinner": "pizza" },  { "name": "john", "dinner": "sushi" },  { "name": "larry", "dinner": "hummus" },  { "name": "john", "dinner": "pie" }];var filteredResult = peoples.find(val => val.name ==="john" && val.dinner==="sushi");console.log(filteredResult)

波斯汪

_.按 lodash 过滤您可以通过 lodash 使用过滤器方法迭代集合的元素,返回所有元素的数组谓词返回truthy for。谓词使用三个参数调用:(值,索引|键,集合)。它返回一个新数组https://lodash.com/docs/4.17.15#filterlodash 上的过滤器使用示例var users = [{&nbsp; &nbsp; 'user': 'barney',&nbsp; &nbsp; 'age': 36,&nbsp; &nbsp; 'active': true&nbsp; },&nbsp; {&nbsp; &nbsp; 'user': 'fred',&nbsp; &nbsp; 'age': 40,&nbsp; &nbsp; 'active': false&nbsp; },&nbsp; {&nbsp; &nbsp; 'user': 'fred',&nbsp; &nbsp; 'age': 39,&nbsp; &nbsp; 'active': true&nbsp; }];console.log("matches:", _.filter(users, function(o) {&nbsp; return !o.active;}));// => [{ active: true, age: 36, user: "barney"}]// The `_.matches` iteratee shorthand.console.log("_.matches` iteratee", _.filter(users, {&nbsp; 'user': 'fred',&nbsp; 'active': true}));// => [{ active: true, age: 39, user: "fred"}]// The `_.matchesProperty` iteratee shorthand.console.log("matchs poperty", _.filter(users, ['active', false]));// => objects for ['fred']// The `_.property` iteratee shorthand._.filter(users, 'active');// => objects for ['barney']<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>_.where by underscore.js你还可以使用underscore.js 的where方法查看列表中的每个值,返回一个包含与属性中列出的键值对匹配的所有值的数组。 _.where(list, properties)_.where 用法示例 _.where(listOfPlays, {author: "Shakespeare", year: 1611});您基本上可以在普通的 javascript 中使用过滤器方法var peoples = [&nbsp; { "name": "bob", "dinner": "pizza" },&nbsp; { "name": "john", "dinner": "sushi" },&nbsp; { "name": "john", "dinner": "sushi" },&nbsp; { "name": "larry", "dinner": "hummus" },&nbsp; { "name": "john", "dinner": "pie" }];var dinner = peoples.filter(e=>e.name ==="john" && e.dinner==="sushi");console.log(dinner)您也可以使用 jquery grepvar peoples = [&nbsp; { "name": "bob", "dinner": "pizza" },&nbsp; { "name": "john", "dinner": "sushi" },&nbsp; { "name": "john", "dinner": "sushi" },&nbsp; { "name": "larry", "dinner": "hummus" },&nbsp; { "name": "john", "dinner": "pie" }];var dinner = $.grep(peoples, function(people) {&nbsp; &nbsp; return people.name === "john" && people.dinner === "sushi";});console.log(dinner)<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>查找 vs 过滤器var peoples = [&nbsp; { "name": "bob", "dinner": "pizza" },&nbsp; { "name": "john", "dinner": "sushi" },&nbsp; { "name": "john", "dinner": "sushi" },&nbsp; { "name": "larry", "dinner": "hummus" },&nbsp; { "name": "john", "dinner": "pie" }];var filterDinner = peoples.filter(e=>e.name ==="john" && e.dinner==="sushi");// return all matching resultsconsole.log('filter dinner -:', filterDinner);var findDinner = peoples.find(e=>e.name ==="john" && e.dinner==="sushi");//returns the first matching rsltconsole.log('find dinner -:', findDinner);不推荐使用 Find,因为它返回第一个匹配结果,并且假设我们有更多匹配结果,它们会被遗漏。

元芳怎么了

考虑以下。var peoples = [{&nbsp; &nbsp; "name": "bob",&nbsp; &nbsp; "dinner": "pizza"&nbsp; },&nbsp; {&nbsp; &nbsp; "name": "john",&nbsp; &nbsp; "dinner": "sushi"&nbsp; },&nbsp; {&nbsp; &nbsp; "name": "larry",&nbsp; &nbsp; "dinner": "hummus"&nbsp; },&nbsp; {&nbsp; &nbsp; "name": "john",&nbsp; &nbsp; "dinner": "pie"&nbsp; }];$.each(peoples, function(i, val) {&nbsp; if (val.name == "john" && val.dinner == "sushi") {&nbsp; &nbsp; console.log("Persons[" + i + "]." + Object.keys(val)[0] + ": " + val.name);&nbsp; }});<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>这会迭代所有项目并比较每个项目的元素。

qq_花开花谢_0

我不知道上下文,但可能有两个 john 并且都将晚餐属性设置为 pie。我建议对数组中的每个条目使用 id 。如果您正在使用的数组是您列出的数组,您可以map在执行搜索之前使用它进行投影/转换。例如const people = [&nbsp; { name: "bob", dinner: "pizza" },&nbsp; { name: "john", dinner: "sushi" },&nbsp; { name: "larry", dinner: "hummus" },&nbsp; { name: "john", dinner: "pie" },];const peopleList = people.map((person, id) => ({ id, ...person }));console.log(peopleList);// You could start from here to search by id

紫衣仙女

您可以设置一个函数来定义您的搜索词,然后使用Array.filter:const peoples = [&nbsp; { "name": "bob", "dinner": "pizza" },&nbsp; { "name": "john", "dinner": "sushi" },&nbsp; { "name": "larry", "dinner": "hummus" },&nbsp; { "name": "john", "dinner": "pie" }];searchTerms = (person) => {&nbsp; return person.name === "john" && person.dinner === "sushi";}console.log(peoples.filter(searchTerms));// [{ "name": "john", "dinner": "sushi" }]
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答