【问题标题】:Concat two arrays with filtering使用过滤连接两个数组
【发布时间】:2018-11-23 07:50:29
【问题描述】:

我有两个数组。我需要将它们结合起来并创建一个具有dayOfWeek 2、3、4、5、6 的新数组。这意味着dayOfWeek 的优先级在array1 中。表示需要保留dayOfWeek 3、4、5 与array1

array1 = [
  {dayOfWeek: 2, home1: "01:30"},
  {dayOfWeek: 3, home1: "02:30"},
  {dayOfWeek: 4, home1: "03:30"},
  {dayOfWeek: 5, home1: "04:30"},
]

array2 = [
  {dayOfWeek: 3, home1: "05:30"},
  {dayOfWeek: 4, home1: "06:30"},
  {dayOfWeek: 5, home1: "07:30"},
  {dayOfWeek: 6, home1: "08:30"},
]

输出应该是

finalArray = [
  {dayOfWeek: 2, home1: "01:30"},
  {dayOfWeek: 3, home1: "02:30"},
  {dayOfWeek: 4, home1: "03:30"},
  {dayOfWeek: 5, home1: "04:30"},
  {dayOfWeek: 6, home1: "08:30"},
]

我试过这个,但它会从两个数组中推送dayOfWeek。如何过滤它们?

const finalArray = []
array1.map((a) => {
    array2.map((a2) => {
        if (a.dayOfWeek === a2.dayOfWeek) {
          finalArray.push(a)
        }
        if (a.dayOfWeek === a2.dayOfWeek) {
          finalArray.push(a2)
        }
    })
})

提前致谢!!!

【问题讨论】:

    标签: javascript arrays loops for-loop lodash


    【解决方案1】:

    您也可以简单地过滤第二个数组中缺少的项目,然后将它们连接到第一个数组而不使用 lodash:

    const a1 = [ {dayOfWeek: 2, home1: "01:30"}, {dayOfWeek: 3, home1: "02:30"}, {dayOfWeek: 4, home1: "03:30"}, {dayOfWeek: 5, home1: "04:30"}, ]
    const a2 = [ {dayOfWeek: 3, home1: "05:30"}, {dayOfWeek: 4, home1: "06:30"}, {dayOfWeek: 5, home1: "07:30"}, {dayOfWeek: 6, home1: "08:30"}, ]
    
    const r = a1.concat(a2.filter(x => !a1.some(y => y.dayOfWeek == x.dayOfWeek)))
    
    console.log(r)

    这是通过Array.concatArray.filterArray.some 完成的

    【讨论】:

      【解决方案2】:

      使用 lodash 的 _.unionBy()。主要数组应该是传递给函数的第一个数组。

      const array1 = [{"dayOfWeek":2,"home1":"01:30"},{"dayOfWeek":3,"home1":"02:30"},{"dayOfWeek":4,"home1":"03:30"},{"dayOfWeek":5,"home1":"04:30"}]
      const array2 = [{"dayOfWeek":3,"home1":"05:30"},{"dayOfWeek":4,"home1":"06:30"},{"dayOfWeek":5,"home1":"07:30"},{"dayOfWeek":6,"home1":"08:30"}]
      
      const result = _.unionBy(array1, array2, 'dayOfWeek')
      
      console.log(result)
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

      如果需要组合多个属性作为联合值,可以使用:

      _.unionBy(array1, array2, o => `${o.id}-${o.dayOfWeek}`)
      

      【讨论】:

      • 我可以为 _.unionBy 使用两个字段吗?我需要通过dayOfWeekid 联合?
      • 查看答案。
      【解决方案3】:

      您也可以使用SetArray.filter

      let array1 = [
        {dayOfWeek: 2, home1: "01:30"},
        {dayOfWeek: 3, home1: "02:30"},
        {dayOfWeek: 4, home1: "03:30"},
        {dayOfWeek: 5, home1: "04:30"},
      ]
      
      let array2 = [
        {dayOfWeek: 3, home1: "05:30"},
        {dayOfWeek: 4, home1: "06:30"},
        {dayOfWeek: 5, home1: "07:30"},
        {dayOfWeek: 6, home1: "08:30"},
      ]
      
      let s = new Set()
      console.log([...array1, ...array2].filter(d => {
          let avail = s.has(d.dayOfWeek)
          !avail && s.add(d.dayOfWeek)
          return !avail
        }
      ) )

      【讨论】:

        【解决方案4】:

        您可以使用数组连接方法,然后进行过滤。

        var c = array1.concat(array2);
        

        【讨论】:

        • 对不起,我不想连接。顺便说一句,谢谢你的回答。
        【解决方案5】:

        教授。您可以使用 Map 对象来获取唯一元素

        const array1 = [
          {dayOfWeek: 2, home1: "01:30"},
          {dayOfWeek: 3, home1: "02:30"},
          {dayOfWeek: 4, home1: "03:30"},
          {dayOfWeek: 5, home1: "04:30"},
        ];
        
        const array2 = [
          {dayOfWeek: 3, home1: "05:30"},
          {dayOfWeek: 4, home1: "06:30"},
          {dayOfWeek: 5, home1: "07:30"},
          {dayOfWeek: 6, home1: "08:30"},
        ];
        
        function getFinalArray(array, uniqueProperty) {
          return array
            .filter(value => value)
            .reduce(
              (arrayMap, item) => {
                return arrayMap.set(item[uniqueProperty], item)
              }, new Map()
            );
        }
        
        const result = Array.from(
          getFinalArray([...array2, ...array1], 'dayOfWeek').values()
        );
        

        【讨论】:

        • 如果您不希望订单被破坏,您可以这样做:.reduce( (arrayMap, item) => !arrayMap.get(item[uniqueProperty]) ? arrayMap.set(item[uniqueProperty], item) : arrayMap, new Map(), 将数组传递为 [...array1,...array2]`
        • 感谢您的加入。最好以arrayMap.has(item[uniqueProperty]) 的方式检查而不是
        【解决方案6】:

        您可以结合使用Array#slice()Array#forEach()Array#some() 方法:

        • 使用.slice(0)获取array1finalArray中的所有元素。
        • 然后使用.forEach()遍历array2,得到finalArray中不存在的所有元素。
        • 使用.some()检查迭代元素(dayOfWeek)是否存在。

        这应该是你的代码:

        var finalArray = array1.slice(0);
        array2.forEach(function(a){
              if(!finalArray.some(e => e.dayOfWeek == a.dayOfWeek))
                  finalArray.push(a);
        });
        

        演示:

        let array1 = [
          {dayOfWeek: 2, home1: "01:30"},
          {dayOfWeek: 3, home1: "02:30"},
          {dayOfWeek: 4, home1: "03:30"},
          {dayOfWeek: 5, home1: "04:30"},
        ];
        
        let array2 = [
          {dayOfWeek: 3, home1: "05:30"},
          {dayOfWeek: 4, home1: "06:30"},
          {dayOfWeek: 5, home1: "07:30"},
          {dayOfWeek: 6, home1: "08:30"},
        ];
        
        var finalArray = array1.slice(0);
        array2.forEach(function(a){
              if(!finalArray.some(e => e.dayOfWeek == a.dayOfWeek))
                  finalArray.push(a);
        });
        
        console.log(finalArray);

        【讨论】:

          猜你喜欢
          • 2021-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-28
          • 2017-11-30
          • 1970-01-01
          • 2016-06-11
          • 1970-01-01
          相关资源
          最近更新 更多