如何从对象数组中筛选与指定对象属性匹配的对象的指定属性
问题:匹配用户并提取指定属性
我有一个存储单个用户属性的对象,还有一个API返回的对象数组。需要找到数组中与单个对象的fullName属性匹配的对象,只返回该对象的animal、animalSize、animalName这几个属性。尝试用.map方法实现但失败了,代码示例如下:
const user = { name: "jan", lastName: "kowalski", fullName: "jan kowalski", car: "audi" } ; const usersAnimal = [ { name: "jan", lastName: "kowalski", fullName: "jan kowalski", animal: "cat", animalSize: "small", animalName: "Bat" }, { name: "john", lastName: "smith", fullName: "john smith", animal: "dog", animalSize: "middle", animalName: "Jerry" }, { name: "Anna", lastName: "Nilsson", fullName: "Anna Nilsson", animal: "cow", animalSize: "big", animalName: "Dorrie" } ]; const filtered = usersAnimal.map((userAnimal)=>userAnimal.fullName === user.fullName && return userAnimal.animalName & userAnimal.animalSize & userAnimal.animal);
解决方案
原代码问题分析
.map方法不适用:.map会遍历数组所有元素并返回对应结果,最终得到和原数组长度一致的新数组,不符合“只返回匹配对象”的需求。- 语法错误:箭头函数中
&& return写法不正确,若要使用return需包裹在花括号内;另外&是位运算符,不能用来组合对象属性,应该返回包含指定属性的对象。
正确实现方式
先用.find找到匹配的对象(因为fullName通常是唯一标识,.find会返回第一个符合条件的元素),再提取需要的属性:
const user = { name: "jan", lastName: "kowalski", fullName: "jan kowalski", car: "audi" }; const usersAnimal = [ { name: "jan", lastName: "kowalski", fullName: "jan kowalski", animal: "cat", animalSize: "small", animalName: "Bat" }, { name: "john", lastName: "smith", fullName: "john smith", animal: "dog", animalSize: "middle", animalName: "Jerry" }, { name: "Anna", lastName: "Nilsson", fullName: "Anna Nilsson", animal: "cow", animalSize: "big", animalName: "Dorrie" } ]; // 找到匹配fullName的对象 const matchedItem = usersAnimal.find(item => item.fullName === user.fullName); // 提取指定属性,处理未找到匹配项的情况 const result = matchedItem ? { animal: matchedItem.animal, animalSize: matchedItem.animalSize, animalName: matchedItem.animalName } : null; console.log(result); // 输出:{ animal: 'cat', animalSize: 'small', animalName: 'Bat' }
简化写法(对象解构)
也可以用对象解构直接提取所需属性,让代码更简洁:
const result = matchedItem ? (({ animal, animalSize, animalName }) => ({ animal, animalSize, animalName }))(matchedItem) : null;
内容的提问来源于stack exchange,提问作者marcinb1986
相关产品推荐
相关产品推荐

