使用javascript根据条件将数组拆分为两个

时间:2021-04-30 12:05:46

标签: javascript arrays

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

[
    {
        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
    }
   ]
  }

5 个答案:

答案 0 :(得分:3)

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

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; }

答案 1 :(得分: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 过滤您的数组。

答案 2 :(得分:1)

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

reduce 的这个优点是只迭代一次数组,使其比双过滤器更高效。

我传递了一个具有 2 个属性的对象:availableData 和 notAvailableData 作为 reduce 的初始值。 在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);

答案 3 :(得分:0)

修改后的代码片段可能像


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;
        },[]);


答案 4 :(得分:0)

我相信您可以在某些库中找到分区函数,例如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);