gpt4 book ai didi

javascript - 通过使用 _.reduce 更好地使用 _.each

转载 作者:行者123 更新时间:2023-11-29 17:43:18 25 4
gpt4 key购买 nike

我需要从现有数组中提取数据,以便为数量为 > 0 的每个项目仅过滤年份和 reference_id

我的sample_array 包含以下数据:

var sample_array = [{
'reference_id': 1,
'products': [{
year: 1,
quantity: 0
}, {
year: 2009,
quantity: 5
}]
}, {
'reference_id': 2,
'products': [{
year: 2009,
quantity: 0
}]
}, {
'reference_id': 3,
'products': [{
year: 1,
quantity: 0
}, {
year: 2009,
quantity: 5
}]
}, {
'reference_id': 4,
'products': [{
year: 2014,
quantity: 10
}, {
year: 2015,
quantity: 6
}]
}];

为了让我按照需要的方式提取数据,我使用了两次 _.each(我仍在少数项目中使用 underscore.js)首先进行过滤,然后用 yearreference_id 重建一个数组。

var references = [];

_.each(sample_array, function(reference) {
reference_products = _.filter(reference.products, function(data) {
return data.quantity > 0;
});
if (!_.isEmpty(reference_products))
_.each(reference_products, function(product) {
references.push({
'reference_id': reference.reference_id,
'year': product.year
});
});
});

它没有任何问题,但我认为它可能存在一种更优雅的方法来构建我的数组引用,使用 _.reduce 购买,但我没有找到实现它的方法。

console.log(references) 的预期结果:

[{
reference_id: 1
year: 2009
} {
reference_id: 3
year: 2009
} {
reference_id: 4
year: 2014
} {
reference_id: 4
year: 2015
}]

有什么建议吗?

最佳答案

reduce 会使代码不必要地复杂化,因为您必须手动收集结果。相反,您可以通过 mapping 数组来创建一个仅包含所需值的中间数组,然后将其展平:

var sample_array = [{
'reference_id': 1,
'products': [{
year: 1,
quantity: 0
}, {
year: 2009,
quantity: 5
}]
}, {
'reference_id': 2,
'products': [{
year: 2009,
quantity: 0
}]
}, {
'reference_id': 3,
'products': [{
year: 1,
quantity: 0
}, {
year: 2009,
quantity: 5
}]
}, {
'reference_id': 4,
'products': [{
year: 2014,
quantity: 10
}, {
year: 2015,
quantity: 6
}]
}];

const combined = _.map(
sample_array,
(e) => // for each first-level element...
_.chain(e.products) // look at its `products` array...
.filter((p) => p.quantity > 0) // keeping only those with a quantity > 0
.map((p) => { // and now return the result of mapping over that array of products
return {
reference_id: e.reference_id,
year: p.year
};
})
.value());

console.log(combined);

// the above value is an array of arrays (one per first-level
// element), so we need to flatten it
const references = _.flatten(combined, true);

console.log(references);

(我在转换函数中使用了 _.chain 以使流程更清晰。)

关于javascript - 通过使用 _.reduce 更好地使用 _.each,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51744349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com