前言:为了从对象数组中删除那些其key不在另一个普通数组中的对象,你可以使用
Array.prototype.filter()方法。这个方法会创建一个新数组,新数组中的元素是通过检查指定函数而得出的所有元素。以下是一个示例:
第一种场景
let objectArray = [ { key1: 'value1' }, { key2: 'value2' }, { key3: 'value3' } ];
let keyArray = ['key1', 'key2']; // 使用filter方法过滤出key在keyArray中的对象
let filteredArray = objectArray.filter(
obj => { // 使用some方法检查对象是否有任何一个key在keyArray中
return Object.keys(obj).some(key => keyArray.includes(key));
}
);
console.log(filteredArray);
在这个示例中,filter方法遍历objectArray中的每个对象。对于每个对象,它调用一个函数,该函数使用Object.keys(obj)来获取对象的所有key,并使用Array.prototype.some()方法来检查这些key中是否有任何一个在keyArray中。如果some()方法返回true(即至少有一个key在keyArray中),则filter方法会将该对象包含在新数组中。最后,filteredArray将只包含那些其key在keyArray中的对象。
第二种场景
注意:这个代码保留了至少有一个key在keyArray中的对象。如果你需要所有key都在keyArray中的对象,你需要修改some为every:
let filteredArray = objectArray.filter(
obj => { // 使用every方法检查对象的所有key是否都在keyArray中
return Object.keys(obj).every(key => keyArray.includes(key));
}
);
这个版本的filteredArray将只包含那些其所有key都在keyArray中的对象。如果对象有任何一个key不在keyArray中,它将被过滤掉。
第三种场景:(reduce非常重要)
let objectArray = [
{ key1: 'value1', key2: 'value2', unwantedKey: 'unwantedValue' },
{ key1: 'value3', key3: 'value4' },
{ key2: 'value5', anotherUnwantedKey: 'anotherUnwantedValue' }
];
// 定义你想要保留的key的数组
let desiredKeys = ['key1', 'key2', 'key3'];
// 使用map方法遍历对象数组,并使用filter方法过滤出需要的键值对
let filteredObjectArray = objectArray.map(obj => {
// 使用filter方法过滤出需要的key
let filteredKeys = Object.keys(obj).filter(key => desiredKeys.includes(key));
// 创建一个新对象,只包含过滤后的键值对
return filteredKeys.reduce((newObj, key) => { newObj[key] = obj[key]; return newObj; },{});
});
console.log(filteredObjectArray);
在这个示例中,我们首先定义了一个包含我们想要保留的key的数组desiredKeys。然后,我们使用map()方法遍历objectArray中的每个对象。对于每个对象,我们使用Object.keys()获取其所有key,然后使用filter()方法过滤出那些在desiredKeys中的key。
接下来,我们使用reduce()方法创建一个新的对象,该对象只包含过滤后的键值对。reduce()方法遍历filteredKeys数组,并将每个key和对应的value添加到新对象中。最后,filteredObjectArray将包含过滤后的对象数组,每个对象只包含desiredKeys中定义的键值对。
注意:如果原始对象中有一些key不在desiredKeys中,这些key和它们的值将不会出现在过滤后的对象中。如果对象中没有任何key在desiredKeys中,过滤后的对象将是一个空对象。