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