【问题标题】:Javascript; pushing common elements from 2 lists to a new listJavascript;将 2 个列表中的公共元素推送到新列表
【发布时间】:2021-11-10 01:50:11
【问题描述】:
let listOne = [Bill, Joe, Trever, Neil, Jim, Pam, Michael]
let listTwo = [Petter, Pam, Steven, Jim, Michael, Scott]

我有两个列表,但我想创建一个仅包含两个列表中的名称的新列表。

[Jim, Pam, Michael]

我做了什么:

我创建了一个嵌套循环来将每个名称推送到一个新列表中

我需要什么帮助:

我觉得有更好的方法来做到这一点。无需嵌套我的循环。也许以某种方式同时过滤两个列表

【问题讨论】:

    标签: javascript list


    【解决方案1】:

    您可以在此处使用Set 和filter。如果要使用set 的has 方法,检查Set 中name 的存在是有效的。

    let listOne = ["Bill", "Joe", "Trever", "Neil", "Jim", "Pam", "Michael"];
    let listTwo = ["Petter", "Pam", "Steven", "Jim", "Michael", "Scott"];
    
    const set = new Set(listOne);
    const result = listTwo.filter(name => set.has(name));
    // or
    // const result = listTwo.filter(set.has.bind(set));
    console.log(result);

    【讨论】:

      【解决方案2】:

      您可以使用 Array.prototype.reduce,让回调搜索另一个列表,并且只插入在另一个列表中的名称。

      listOne.reduce((prev, cur)=>{
          if(listTwo.includes(cur)){
              prev.push(cur);
          }
          return prev;
      });
      

      编辑:经过进一步测试,Array.prototype.reduce 要求第一个和第二个参数具有数字类型,因此我建议使用 filter 代替。 (查看其他答案)
      但是,如果您想使用 reduce,则必须使用以下内容:

      let listOne = ["Bill", "Joe", "Trever", "Neil", "Jim", "Pam", "Michael"];
      let listTwo = ["Petter", "Pam", "Steven", "Jim", "Michael", "Scott"];
      let results = [];
      listOne.reduce((prev, cur)=> {
        if(listTwo.includes(cur)){
          results.push(cur);
        }
        return;
      });
      console.log(results); // Prints [ 'Jim', 'Pam', 'Michael' ]
      

      我的建议是使用 Vitor Franca 接受的答案并使用 Array.prototype.filter

      【讨论】:

      • 您没有指定要减少的第二个参数。那么你怎么能使用prev.push(cur);。伙计,这不是正确的解决方案
      【解决方案3】:

      你可以这样做:

      let listOne = [Bill, Joe, Trever, Neil, Jim, Pam, Michael]
      let listTwo = [Petter, Pam, Steven, Jim, Michael, Scott]
      
      let result = listOne.filter(item => listTwo.includes(item))
      

      【讨论】:

      【解决方案4】:

      const listOne = ["Bill", "Joe", "Trever", "Neil", "Jim", "Pam", "Michael"]
      const listTwo = ["Petter", "Pam", "Steven", "Jim", "Michael", "Scott"]
      
      const newList = listOne.filter(item => listTwo.indexOf(item) > -1)
      console.log(newList)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-04
        • 1970-01-01
        相关资源
        最近更新 更多