Return 只有正值的格式化对象
Return formatted object with only positive values
我有一个对象的对象。我的每个嵌套对象都有一个价格作为嵌套数组,其中可能包含负值。
我需要格式化对象和 return 一个新对象,其子对象只包含正值。
例如,
在下面的代码中,理想情况下它应该只有 return 对象和 'TypeB' 对象,因为只有价格具有非负值。
我试过了,但我想我漏掉了什么。
另外,我可以使用 'reduce' 方法来优化它吗?
输入对象:
{
"TypeA": [
{
"price": [
[
{
"amount": -45,
"currency": "USD"
}
]
],
"name": "ABC",
"priceDetails": [
{
"name": "BASE",
"price": [
[
{
"amount": -40.00,
"currency": "USD"
}
]
]
},
{
"name": "TAX",
"price": [
[
{
"amount": -5.00,
"currency": "USD"
}
]
]
}
]
}
],
"TypeB": [
{
"price": [
[
{
"amount": 0,
"currency": "USD"
}
]
],
"name": "ABC",
"priceDetails": [
{
"name": "BASE",
"price": [
[
{
"amount": 0,
"currency": "USD"
}
]
]
}
]
}
]
}
预期输出:
{
"TypeB": [
{
"price": [
[
{
"amount": 0,
"currency": "USD"
}
]
],
"name": "ABC",
"priceDetails": [
{
"name": "BASE",
"price": [
[
{
"amount": 0,
"currency": "USD"
}
]
]
}
]
}
]
}
代码:
const data = {
"TypeA": [{
"price": [
[{
"amount": -45,
"currency": "USD"
}]
],
"name": "ABC",
"priceDetails": [{
"name": "BASE",
"price": [
[{
"amount": -40.00,
"currency": "USD"
}]
]
},
{
"name": "TAX",
"price": [
[{
"amount": -5.00,
"currency": "USD"
}]
]
}
]
}],
"TypeB": [{
"price": [
[{
"amount": 0,
"currency": "USD"
}]
],
"name": "ABC",
"priceDetails": [{
"name": "BASE",
"price": [
[{
"amount": 0,
"currency": "USD"
}]
]
}]
}]
};
const formattedData = Object.values(data).filter(item => {
return item.map(elem => {
const itemPrice = elem.price;
const isPositive = itemPrice[0][0].amount >= 0;
return isPositive ? elem : false;
});
});
console.log(formattedData);
cc = {
"TypeA": [
{
"price": [
[
{
"amount": -45,
"currency": "USD"
}
]
],
"name": "ABC",
"priceDetails": [
{
"name": "BASE",
"price": [
[
{
"amount": -40.00,
"currency": "USD"
}
]
]
},
{
"name": "TAX",
"price": [
[
{
"amount": -5.00,
"currency": "USD"
}
]
]
}
]
}
],
"TypeB": [
{
"price": [
[
{
"amount": 0,
"currency": "USD"
}
]
],
"name": "ABC",
"priceDetails": [
{
"name": "BASE",
"price": [
[
{
"amount": 0,
"currency": "USD"
}
]
]
}
]
}
]
}
const dd = Object.keys(cc).reduce((acc, item) => {
if (cc[item][0].price[0][0].amount >= 0) {
acc[item] = cc[item];
}
return acc;
}, {});
console.log(dd)
试试这个
const result = Object.keys(data).filter(i => data[i][0].price[0][0].amount >= 0).map(y => data[y])
console.log(result) // positive amount array
编辑:使用减速器
const dd = Object.keys(data).reduce((acc, item) => {
if (data[item][0].price[0][0].amount >= 0) {
acc[item] = data[item];
}
return acc;
}, {});
您可以使用各种检查来过滤数据,如果找到想要的叶对象,则构建一个新对象。
function filter(object) {
if (!object || typeof object !== 'object') return;
if ('amount' in object) return object.amount >= 0 ? object : undefined;
if (Array.isArray(object)) {
var items = object.reduce((r, v) => {
var temp = filter(v);
if (temp) r.push(temp);
return r;
}, []);
return items.length ? items : undefined;
} else {
var entries = Object.entries(object).reduce((r, [k, v]) => {
var temp = filter(v);
if (temp) r.push([k, temp]);
return r;
}, []);
return entries.length ? Object.fromEntries(entries) : undefined;
}
}
var data = { TypeA: [{ price: [[{ amount: -45, currency: "USD" }]], name: "ABC", priceDetails: [{ name: "BASE", price: [[{ amount: -40, currency: "USD" }]] }, { name: "TAX", price: [[{ amount: -5, currency: "USD" }]] }] }], TypeB: [{ price: [[{ amount: 0, currency: "USD" }]], name: "ABC", priceDetails: [{ name: "BASE", price: [[{ amount: 0, currency: "USD" }]] }] }] },
result = filter(data);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
可以使用 Object.entries
使您的对象成为数组,然后只需 filter
检查 every
数量是否大于 0
:
const filtered = Object.entries(data).filter(([k, v]) =>
v.every(s=> s.price.every(s1 => s1.every(s2 => s2.amount >= 0 )))
&& v.every(pd => pd.priceDetails.every(pdp =>
pdp.price.every(pr => pr.every(prr => prr.amount >= 0))))
);
一个例子:
const data = {
"TypeA": [{
"price": [ [{ "amount": -45, "currency": "USD" }]
],
"name": "ABC",
"priceDetails": [{
"name": "BASE",
"price": [[{ "amount": -40.00, "currency": "USD" }]]
},
{
"name": "TAX",
"price": [ [{ "amount": -5.00, "currency": "USD" }]]
}
]
}],
"TypeB": [{
"price": [ [{"amount": 0, "currency": "USD" }]],
"name": "ABC",
"priceDetails": [{
"name": "BASE",
"price": [[{"amount": 0, "currency": "USD"}]]
}]
}]
};
const filtered = Object.entries(data).filter(([k, v]) =>
v.every(s=> s.price.every(s1 => s1.every(s2 => s2.amount >= 0 )))
&& v.every(pd => pd.priceDetails.every(pdp => pdp.price.every(pr => pr.every(prr => prr.amount >= 0))))
);
const result = Object.fromEntries(filtered);
console.log(result);
我有一个对象的对象。我的每个嵌套对象都有一个价格作为嵌套数组,其中可能包含负值。 我需要格式化对象和 return 一个新对象,其子对象只包含正值。
例如, 在下面的代码中,理想情况下它应该只有 return 对象和 'TypeB' 对象,因为只有价格具有非负值。
我试过了,但我想我漏掉了什么。 另外,我可以使用 'reduce' 方法来优化它吗?
输入对象:
{
"TypeA": [
{
"price": [
[
{
"amount": -45,
"currency": "USD"
}
]
],
"name": "ABC",
"priceDetails": [
{
"name": "BASE",
"price": [
[
{
"amount": -40.00,
"currency": "USD"
}
]
]
},
{
"name": "TAX",
"price": [
[
{
"amount": -5.00,
"currency": "USD"
}
]
]
}
]
}
],
"TypeB": [
{
"price": [
[
{
"amount": 0,
"currency": "USD"
}
]
],
"name": "ABC",
"priceDetails": [
{
"name": "BASE",
"price": [
[
{
"amount": 0,
"currency": "USD"
}
]
]
}
]
}
]
}
预期输出:
{
"TypeB": [
{
"price": [
[
{
"amount": 0,
"currency": "USD"
}
]
],
"name": "ABC",
"priceDetails": [
{
"name": "BASE",
"price": [
[
{
"amount": 0,
"currency": "USD"
}
]
]
}
]
}
]
}
代码:
const data = {
"TypeA": [{
"price": [
[{
"amount": -45,
"currency": "USD"
}]
],
"name": "ABC",
"priceDetails": [{
"name": "BASE",
"price": [
[{
"amount": -40.00,
"currency": "USD"
}]
]
},
{
"name": "TAX",
"price": [
[{
"amount": -5.00,
"currency": "USD"
}]
]
}
]
}],
"TypeB": [{
"price": [
[{
"amount": 0,
"currency": "USD"
}]
],
"name": "ABC",
"priceDetails": [{
"name": "BASE",
"price": [
[{
"amount": 0,
"currency": "USD"
}]
]
}]
}]
};
const formattedData = Object.values(data).filter(item => {
return item.map(elem => {
const itemPrice = elem.price;
const isPositive = itemPrice[0][0].amount >= 0;
return isPositive ? elem : false;
});
});
console.log(formattedData);
cc = {
"TypeA": [
{
"price": [
[
{
"amount": -45,
"currency": "USD"
}
]
],
"name": "ABC",
"priceDetails": [
{
"name": "BASE",
"price": [
[
{
"amount": -40.00,
"currency": "USD"
}
]
]
},
{
"name": "TAX",
"price": [
[
{
"amount": -5.00,
"currency": "USD"
}
]
]
}
]
}
],
"TypeB": [
{
"price": [
[
{
"amount": 0,
"currency": "USD"
}
]
],
"name": "ABC",
"priceDetails": [
{
"name": "BASE",
"price": [
[
{
"amount": 0,
"currency": "USD"
}
]
]
}
]
}
]
}
const dd = Object.keys(cc).reduce((acc, item) => {
if (cc[item][0].price[0][0].amount >= 0) {
acc[item] = cc[item];
}
return acc;
}, {});
console.log(dd)
试试这个
const result = Object.keys(data).filter(i => data[i][0].price[0][0].amount >= 0).map(y => data[y])
console.log(result) // positive amount array
编辑:使用减速器
const dd = Object.keys(data).reduce((acc, item) => {
if (data[item][0].price[0][0].amount >= 0) {
acc[item] = data[item];
}
return acc;
}, {});
您可以使用各种检查来过滤数据,如果找到想要的叶对象,则构建一个新对象。
function filter(object) {
if (!object || typeof object !== 'object') return;
if ('amount' in object) return object.amount >= 0 ? object : undefined;
if (Array.isArray(object)) {
var items = object.reduce((r, v) => {
var temp = filter(v);
if (temp) r.push(temp);
return r;
}, []);
return items.length ? items : undefined;
} else {
var entries = Object.entries(object).reduce((r, [k, v]) => {
var temp = filter(v);
if (temp) r.push([k, temp]);
return r;
}, []);
return entries.length ? Object.fromEntries(entries) : undefined;
}
}
var data = { TypeA: [{ price: [[{ amount: -45, currency: "USD" }]], name: "ABC", priceDetails: [{ name: "BASE", price: [[{ amount: -40, currency: "USD" }]] }, { name: "TAX", price: [[{ amount: -5, currency: "USD" }]] }] }], TypeB: [{ price: [[{ amount: 0, currency: "USD" }]], name: "ABC", priceDetails: [{ name: "BASE", price: [[{ amount: 0, currency: "USD" }]] }] }] },
result = filter(data);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
可以使用 Object.entries
使您的对象成为数组,然后只需 filter
检查 every
数量是否大于 0
:
const filtered = Object.entries(data).filter(([k, v]) =>
v.every(s=> s.price.every(s1 => s1.every(s2 => s2.amount >= 0 )))
&& v.every(pd => pd.priceDetails.every(pdp =>
pdp.price.every(pr => pr.every(prr => prr.amount >= 0))))
);
一个例子:
const data = {
"TypeA": [{
"price": [ [{ "amount": -45, "currency": "USD" }]
],
"name": "ABC",
"priceDetails": [{
"name": "BASE",
"price": [[{ "amount": -40.00, "currency": "USD" }]]
},
{
"name": "TAX",
"price": [ [{ "amount": -5.00, "currency": "USD" }]]
}
]
}],
"TypeB": [{
"price": [ [{"amount": 0, "currency": "USD" }]],
"name": "ABC",
"priceDetails": [{
"name": "BASE",
"price": [[{"amount": 0, "currency": "USD"}]]
}]
}]
};
const filtered = Object.entries(data).filter(([k, v]) =>
v.every(s=> s.price.every(s1 => s1.every(s2 => s2.amount >= 0 )))
&& v.every(pd => pd.priceDetails.every(pdp => pdp.price.every(pr => pr.every(prr => prr.amount >= 0))))
);
const result = Object.fromEntries(filtered);
console.log(result);