【问题标题】:如何过滤嵌套的 javascript 对象并返回父对象?
【发布时间】:2022-01-21 02:57:20
【问题描述】:

我正在尝试将嵌套对象过滤成两部分,然后如果有任何匹配的兄弟要返回,则返回父(和兄弟)对象。

我一直在查看 this SO 线程作为参考。

我认为我很接近,但不太确定我做错了什么。

我有一个order,看起来像这样:

{
    "name": "Name",
    "email": "email@email.com",
    "createdAt": "2021-12-01T21:19:29.682Z",
    "purchasables": [
        {
            "type": "FOO",
            ...
        },
        {
            "type": "BAR",
            ...
        }
    ]
}

任何给定的订单都可以包含多个东西(可购买)。我正在尝试过滤订单日期order.createdAt,然后过滤可购买的类型

// vue.js

data() {
    return {
      items: [],
      day: dayjs()
    };
},

props: {
    orders: {
      type: Array,
      required: false,
      default: () => [],
    },
},

methods: {
   filterPurchasables() {
      this.items = this.orders.filter((order) => {
        order.purchasables.every((purchasable) => {
          console.log('type: ', purchasable.type); // FOO
          
          return purchasable.type === 'FOO';
        });

        return dayjs(order.createdAt).isSame(this.day, "date");
      });
    },
},

如果我只过滤订单的createdAt 日期,一切似乎都很好。

this.items = this.orders.filter((order) => {
    return dayjs(order.createdAt).isSame(this.day, "date");
});

最后,我想要找回的是:

{
    "name": "Name",
    "email": "email@email.com",
    "createdAt": "2021-12-01T21:19:29.682Z",
    "purchasables": [
        {
            "type": "FOO",
            ...
        }
    ]
}
  • 仅当日期匹配时才会返回订单
  • 仅返回匹配的正确可购买物品(例如 FOO)

目前,我总是把两个可购买的东西都拿回来。我曾尝试使用.some(),但得到了相同的结果。

感谢您的任何建议!

编辑

这就是我现在所拥有的,似乎正在得到我所追求的结果。我不相信这是理想的...

this.items = this.orders.filter((order) => {
    order.purchasables = order.purchasables.filter((p) =>{
        return p.type === "FOO";
    });
        
    return dayjs(order.createdAt).isSame(this.day, "date");
});

【问题讨论】:

  • 您正在检查 2 个条件(可购买和日期),但只使用其中一个(日期)。您需要使用&& 加入这两个条件。

标签: javascript vue.js vuejs2


【解决方案1】:

您可以通过createdAt属性过滤您的数据,然后在过滤后的数据中,您可以再次过滤purchasables,如下所示:

this.items = this.orders.filter(order => dayjs(order.createdAt).isSame(this.day, "date")).map(item => ({...item, purchasables: item.purchasables.filter(p => p.type == 'FOO') }))

【讨论】:

    猜你喜欢
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多