按值过滤对象数组

时间:2021-07-26 14:06:05

标签: javascript arrays

我想通过对象中的特定值过滤对象数组。

在我提供的示例中,我想通过数组 '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'));

2 个答案:

答案 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());
  }
}