【问题标题】:split an array into two based on condition using javascript使用javascript根据条件将数组拆分为两个
【发布时间】:2021-07-23 18:42:17
【问题描述】:

我有一个像下面这样的对象数组。

[
    {
        product_id: 4,
        product_name: "Samsung",
        category_name: "Tv and home appliance",
        is_Available: 1
    },
    {
        product_id: 8,
        product_name: "Apple",
        category_name: "Home gadgets",
        is_Available: 1
    },
    {
        product_id: 9,
        product_name: "Verifone",
        category_name: "Electronics",
        is_Available: 0
    }
  ]

我想根据 is_Available 标志值将此数组一分为二。所以我确实喜欢使用 reduce。

const formmattedResponse = data.reduce((arr,el) => {
            if(el.is_Available === 1) {
                arr.push({...el});
            }
            return arr;
        },[]);

但是,我需要基于上述数据数组的这种类型的格式化数据,如下所示

{
    availableData: [{
        product_id: 4,
        product_name: "Samsung",
        category_name: "Tv and home appliance",
        is_Available: 1
    },
    {
        product_id: 8,
        product_name: "Apple",
        category_name: "Home gadgets",
        is_Available: 1
    }
   ],
  notAvailableData: [{
        product_id: 9,
        product_name: "Verifone",
        category_name: "Electronics",
        is_Available: 0
    }
   ]
  }

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    您可以使用一个数组并通过单个循环根据它们的可用性推送对象。

    const
        data = [{ product_id: 4, product_name: "Samsung", category_name: "Tv and home appliance", is_Available: 1 }, { product_id: 8, product_name: "Apple", category_name: "Home gadgets", is_Available: 1 }, { product_id: 9, product_name: "Verifone", category_name: "Electronics", is_Available: 0 }],
        result = data.reduce((r, o) => {
            r[o.is_Available ? 'availableData' : 'notAvailableData'].push(o);
            return r;
        }, { availableData: [], notAvailableData: [] });
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案2】:

      const data = [
          {
              product_id: 4,
              product_name: "Samsung",
              category_name: "Tv and home appliance",
              is_Available: 1
          },
          {
              product_id: 8,
              product_name: "Apple",
              category_name: "Home gadgets",
              is_Available: 1
          },
          {
              product_id: 9,
              product_name: "Verifone",
              category_name: "Electronics",
              is_Available: 0
          }
        ];
      const result = {
        availableData:  data.filter(el => el.is_Available),
        notAvailableData:  data.filter(el => !el.is_Available),
      };
      
      console.log(result);

      您可以使用 Array.filter() 根据 is_Available 过滤您的数组。

      【讨论】:

      • 最好只迭代一次,这可以通过reduce来实现
      【解决方案3】:

      您有两个选择:要么过滤列表两次,要么为包含两个数组的 reduce 函数添加不同的累加器。

      reduce 的优点是只对数组进行一次迭代,比双过滤器更高效。

      我传递了一个具有 2 个属性的对象:availableData 和 notAvailableData 作为 reduce 的初始值。 在减少期间,我检查您要过滤的属性并将其添加到正确的列表中。 在 reduce 函数中,我返回上下文对象,因此下一次迭代也有它。

      reduce 最终返回该对象,完成排序。

      var arr = [
        {
          product_id: 4,
          product_name: "Samsung",
          category_name: "Tv and home appliance",
          is_Available: 1
        },
        {
          product_id: 8,
          product_name: "Apple",
          category_name: "Home gadgets",
          is_Available: 1
        },
        {
          product_id: 9,
          product_name: "Verifone",
          category_name: "Electronics",
          is_Available: 0
        }
      ]
      
      var context = arr.reduce((ctx, el) => {
        if (el.is_Available) {
          ctx.availableData.push(el);
        } else {
          ctx.notAvailableData.push(el);
        }
        return ctx
      }, {availableData: [], notAvailableData: []})
      
      console.log(context);

      【讨论】:

        【解决方案4】:

        修改后的片段可能是这样的

        
        const formmattedResponse = data.reduce((arr,el) => {
                  let finalResp = { 
                          availableData: [],
                        notAvailableData : []
                    }
                    if(el.is_Available === 1) {
                        finalResp["availableData"].push({...el});
                    } else {
                finalResp["notAvailableData "].push({...el});
             }
                    return finalResp;
                },[]);
        
        
        

        【讨论】:

          【解决方案5】:

          我相信您可以在某些库中找到分区函数,例如lodash 会将一个数组拆分为两个数组,一个匹配条件,另一个不匹配。我在这里写了一个快速版本来演示它。

          const data = [{"product_id":4,"product_name":"Samsung","category_name":"Tv and home appliance","is_Available":1},{"product_id":8,"product_name":"Apple","category_name":"Home gadgets","is_Available":1},{"product_id":9,"product_name":"Verifone","category_name":"Electronics","is_Available":0}];
          
          const partition = (array, filter_fn) =>
            array.reduce(
              (acc, val) => (acc[filter_fn(val) ? 0 : 1].push(val), acc),
              [[], []]
            );
          
          const new_keys = ['availableData', 'notAvailableData'];
          
          const result = Object.fromEntries(
            partition(data, (item) => item.is_Available)
              .map((arr, i) => [new_keys[i], arr])
          );
          
          console.log(result);

          【讨论】:

            猜你喜欢
            • 2011-10-15
            • 1970-01-01
            • 2013-12-04
            • 1970-01-01
            • 1970-01-01
            • 2012-12-06
            • 1970-01-01
            • 1970-01-01
            • 2012-01-26
            相关资源
            最近更新 更多