我有一个像下面这样的对象数组。
[
{
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
}
]
}
答案 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);