【问题标题】:filter array by value based on another array基于另一个数组按值过滤数组
【发布时间】:2020-12-03 16:51:24
【问题描述】:

我有一堆卡片。我需要根据另一个数组按值字过滤它。只有那些对象应该保留在与数组 hardWords 中的名称相对应的卡片中

const cards = [ 
  {
      word: 'cry',
    },
    {
      word: 'fishing',
    },
    {
      word: 'fly',
    },
    {
      word: 'hug',
    },
  ],
  [
    {
      word: 'open',
    },
    {
      word: 'play',
    },
    {
      word: 'run',
    },
    {
      word: 'sing',
    },
  ],
.....
let difficultWords = ["cry", "run", "sing"];

这是我的代码:(但 id 不起作用)

 let wrongCard = cards.forEach(card => {
    card.filter(el => difficultWords.forEach(i => el.word === i));
 }

输出应该是

let wrongCard = [ 
  [
    {
      word: 'cry',
    },
  ],
  [
    {
      word: 'run',
    },
    {
      word: 'sing',
    },
]
    

【问题讨论】:

  • 预期输出与输入有何关系?

标签: javascript arrays filter


【解决方案1】:

const cards = [
  [
    {
      word: 'cry'
    },
    {
      word: 'fishing'
    },
    {
      word: 'fly'
    },
    {
      word: 'hug'
    }
  ],
  [
    {
      word: 'open'
    },
    {
      word: 'play'
    },
    {
      word: 'run'
    },
    {
      word: 'sing'
    }
  ]
];
let difficultWords = ['cry', 'run', 'sing'];

const wrongCard = cards.map((card) =>
  card.filter((c) => difficultWords.includes(c.word))
);

console.log(wrongCard);

【讨论】:

  • 它无法正常工作。它返回一个数组中与所需对象一起的其他对象
  • @rise 你能用准确的输入和期望值更新你的帖子吗?
【解决方案2】:

您可以为此使用.map.includes

let wrongCard = cards.forEach(card => {
    card.filter(el => difficultWords.forEach(i => el.word === i));
 }

因为你写了let wrongCard = cards.forEach...,所以我假设你想将结果分配给wrongCard

要将一个数组转换为另一个数组,应使用.map,因为.forEach 将返回undefined

接下来,因为difficultWords是字符串数组,而word也是字符串,要检查一个值是否在数组内,我们可以使用diffultWords.includes(word),这将返回true是包含的单词在diffultWords中。

const cards = [
  [{ word: "hug" }],
  [{ word: "open" }, { word: "play" }, { word: "hug" }],
  [{ word: "point" }],
];
let difficultWords = ["point", "hug", "frog", "lion"];

const result = cards.map((arr) => {
  return arr.filter((value) => {
    return difficultWords.includes(value.word);
  });
});

console.log(result)

【讨论】:

    【解决方案3】:

    您可以使用Array#map 使用过滤后的值创建一个新数组。

    const cards = [ 
      [{
          word: 'cry',
        },
        {
          word: 'fishing',
        },
        {
          word: 'fly',
        },
        {
          word: 'hug',
        },
      ],
      [
        {
          word: 'open',
        },
        {
          word: 'play',
        },
        {
          word: 'run',
        },
        {
          word: 'sing',
        },
      ]];
    let difficultWords = ["cry", "run", "sing"];
    const res = cards.map(x => x.filter(({word}) => difficultWords.includes(word)));
    console.log(res);

    【讨论】:

      【解决方案4】:

      成功了,恭喜!!!!

      const cards = [
        [{ word: "hug" }],
        [{ word: "open" }, { word: "play" }, { word: "hug" }],
        [{ word: "point" }],
      ];
      let difficultWords = ["point", "hug", "frog", "lion"];
      
      let res = [];
      difficultWords.forEach(val => {
        cards.map(item => {
        item.map(e =>{
        if(e.word === val) {
         res.push(e)
        }})
        })
      })
      
      console.log(res)

      【讨论】:

        猜你喜欢
        • 2016-03-28
        • 1970-01-01
        • 1970-01-01
        • 2019-10-03
        • 1970-01-01
        • 2020-06-24
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多