我想通过对象中的特定值过滤对象数组。
在我提供的示例中,我想通过数组 'characteristics' 中的值过滤数组 'pets'。例如,在我使用参数 'loyal' 调用函数的地方,我只希望返回 dog 值的对象,因为只有 dog 具有该特征。
在我调用该函数时,两个对象都被返回,即使只有 dog 的对象在其特性数组中具有该值。
const pets = [
{
name: 'dog',
characteristics: [
{
value: 'loyal'
},
{
value: 'big'
}
]
},
{
name: 'cat',
characteristics: [
{
value: 'fluffy'
},
{
value: 'small'
}
]
},
]
function filterPets(pets, characteristic) {
return pets.filter(function(pet) {
return pet.characteristics.filter(o => o.value.includes(characteristic));
})
}
console.log(filterPets(pets, 'loyal'));
答案 0 :(得分:4)
那是因为对于 characteristics
检查,您使用的是 filter
,它总是返回一个数组(即使是一个空白数组),即使是一个空白数组也是一个真值,所以外部 { {1}} 保留您检查的每只宠物。对于该内部检查,您需要 some
,而不是 filter
,因此您会得到一个是否有任何条目匹配的标志:
filter
function filterPets(pets, characteristic) {
return pets.filter(function(pet) {
return pet.characteristics.some(o => o.value.includes(characteristic));
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^
});
}
就其价值而言,我认为特征是独一无二的(您不能有两次“忠诚”),因此您可能更愿意将它们保存在 Set
中,以便您可以比 { 更轻松地检查它们{1}}。例如:
const pets = [
{
name: 'dog',
characteristics: [
{
value: 'loyal'
},
{
value: 'big'
}
]
},
{
name: 'cat',
characteristics: [
{
value: 'fluffy'
},
{
value: 'small'
}
]
},
];
function filterPets(pets, characteristic) {
return pets.filter(function(pet) {
return pet.characteristics.some(o => o.value.includes(characteristic));
});
}
console.log(filterPets(pets, 'loyal'));
现场示例:
.some(o => o.includes(characteristic))
答案 1 :(得分:0)
function onEdit(e) {
var s = e.range.getSheet();
if (s.getName() == "Database") {
var e.range = s.getActiveCell();
if (e.range.getColumn() == 7) {
var nextCell = e.range.offset(0, 1);
if (nextCell.getValue() == '')
nextCell.setValue(new Date());
}
}
if (e.range.getValue() == "_now") {
e.range.setValue(new Date());
}
}