【问题标题】:Filter an array of objects based on array property containing all values from another array根据包含来自另一个数组的所有值的数组属性过滤对象数组
【发布时间】:2023-04-01 16:00:01
【问题描述】:

我有一个对象数组:

const breeds=[{name: 'Golden', temperament: ['friendly', 'kind', 'smart']},{name: 'Husky', temperament: ['alert', 'loyal', 'gentle']},{name: 'Yorkshire Terrier', temperament: ['bold', 'independent', 'kind']}]

我想按选定的“气质”对它们进行排序。假设用户同时选择了“善良”和“友好”,它应该只返回“金色”。

我正在使用 javascript 和下划线,这是我迄今为止尝试过的:

 //selected is an array of selected temperaments
 //breeds is the array of objects
function filterTemperaments(selected, breeds) {
  return _.filter(breeds, function (breed) {
    if (!breed.temperament) breed.temperament = "";
    const breedList = breed.temperament;
    return breedList.includes(...selected);
  }, selected);
}

这似乎只返回与所选数组中的第一个气质匹配的品种。例如,如果选择的是['kind', 'loyal'],品种是{name:'Golden', temperament: ['kind', 'smelly']},尽管不符合“忠诚”的气质,Golden 仍将返回真实状态

这里有更好的解决方案的想法吗?提前致谢!!

【问题讨论】:

    标签: javascript sorting underscore.js


    【解决方案1】:

    您可以使用filter 仅返回选择了every 气质的品种

    const breeds=[{name: 'Golden', temperament: ['friendly', 'kind', 'smart']},{name: 'Husky', temperament: ['alert', 'loyal', 'gentle']},{name: 'Yorkshire Terrier', temperament: ['bold', 'independent', 'kind']}],
        selected = ['kind', 'friendly']
    
    const filtered = breeds.filter(b => selected.every(s => b.temperament.includes(s)))
    
    console.log(filtered)

    【讨论】:

    • 而不是 every 它应该是 some 因为如果选择的是 ['loyal', 'smart'] 你不会得到结果,你应该得到 2 个结果,因为 2 只狗匹配那些选择。
    • @PrinceHernandez 但 OP 希望匹配所选的所有气质:“假设用户同时选择了“善良”和“友好”,它应该只返回“金色”。”
    • @adiga 是正确的,我正在寻找“每个”。感谢您的快速回复!
    • 你完全正确,我误解了问题的第二个陈述。
    【解决方案2】:

    使用filterevery 很容易使用,以便了解您是否有任何匹配项并返回匹配的值。

    const breeds = [{
      name: 'Golden',
      temperament: ['friendly', 'kind', 'smart']
    }, {
      name: 'Husky',
      temperament: ['alert', 'loyal', 'gentle']
    }, {
      name: 'Yorkshire Terrier',
      temperament: ['bold', 'independent', 'kind']
    }]
    
    //selected is an array of selected temperaments
    //breeds is the array of objects
    function filterTemperaments(selected, breeds) {
      return breeds.filter(({ temperament }) => { //here I'm desctructuring the object only to get the temperaments.
        return selected.every(selection => temperament.indexOf(selection) !== -1)
      })
    
    }
    
    const result = filterTemperaments(['kind', 'friendly'], breeds);
    console.log(result)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      相关资源
      最近更新 更多