如何筛选对象属性?获取对象数组中值为最大值的名称数组
嘿,这两个问题我经常碰到,给你详细拆解一下!
一、如何对对象的属性进行筛选?
对象属性筛选一般分两种场景:保留指定属性或者排除指定属性,我给你每种场景都写几个实用的方法:
1. 保留指定属性
比如你有一个原始对象,只想留下name和email属性:
const originalObj = { name: 'Alice', age: 25, email: 'alice@example.com', address: 'NY' }; const keepProps = ['name', 'email']; // 方法1:用reduce逐个收集属性 const filteredObj = keepProps.reduce((acc, prop) => { // 先判断原始对象有没有这个属性,避免添undefined if (originalObj.hasOwnProperty(prop)) { acc[prop] = originalObj[prop]; } return acc; }, {}); // 方法2:用Object.fromEntries更简洁 const filteredObj2 = Object.fromEntries( keepProps.map(prop => [prop, originalObj[prop]]).filter(([prop]) => originalObj.hasOwnProperty(prop)) );
2. 排除指定属性
如果是想去掉某些属性(比如age和address),可以这么做:
const excludeProps = ['age', 'address']; // 方法1:ES6解构赋值,超级直观 const { age, address, ...filteredObj3 } = originalObj; // 方法2:用reduce过滤掉不需要的属性 const filteredObj4 = Object.keys(originalObj).reduce((acc, prop) => { if (!excludeProps.includes(prop)) { acc[prop] = originalObj[prop]; } return acc; }, {});
二、从对象数组中提取value为最大值的name数组
这个需求我也常写,分两步走就很清晰:先找到数组里的最大value,再过滤出所有value等于最大值的项,最后提取它们的name就行。
举个例子:
const data = [ { name: 'Apple', value: 10 }, { name: 'Banana', value: 20 }, { name: 'Orange', value: 20 }, { name: 'Grape', value: 15 } ]; // 处理边界情况:如果数组为空直接返回空数组 if (data.length === 0) { console.log([]); } else { // 步骤1:拿到所有value中的最大值 const maxValue = Math.max(...data.map(item => item.value)); // 步骤2:筛选出value等于最大值的项,提取name const result = data.filter(item => item.value === maxValue).map(item => item.name); console.log(result); // 输出: ['Banana', 'Orange'] }
如果你的数组里可能有value不是数字的情况,还可以加个判断确保value是有效数字,避免Math.max返回NaN:
const validValues = data.map(item => item.value).filter(val => typeof val === 'number' && !isNaN(val)); if (validValues.length === 0) { console.log([]); } else { const maxValue = Math.max(...validValues); const result = data.filter(item => item.value === maxValue).map(item => item.name); console.log(result); }
内容的提问来源于stack exchange,提问作者DCR
相关产品推荐
相关产品推荐

