【问题标题】:Remove array of object if object inside is empty如果内部对象为空,则删除对象数组
【发布时间】:2021-11-02 08:28:31
【问题描述】:

我正在准备这样的数组

 datas[5] = { "qty_sized": "1", "resolution": "5", "status": "", "order": 1342 };

其中 [5] 是动态响应。

我有一个对象 mydata,在里面我有一个对象 items。

我使用assign将数组推送到对象项

Object.assign(mydatadata.items, datas);

现在 mydata.items 有一个数组集, `

items{
1 {qty_auth: "", resolution: "4", status: "", order: "1495"},
5 {qty_sized: "1", resolution: "4", status: "", order: "1485"}
}`

现在如果 qty_auth: "" ,我需要从中检查 qty_ 是否为空,然后删除数组。所以预期的输出是这样的: 注意:qty_ 在这里是动态的。

items{ 5 {qty_sized: "1", resolution: "4", status: "", order: "1485"} }

我想在同一个对象 mydata.items 中产生结果

我试过这样的

const mydatadata.items  = mydata.items.filter((o) =>
            Object.keys(o).some((k) => k.startsWith("qty") && o[k])
);

console.log(result);

但它现在给了我任何输出

【问题讨论】:

    标签: javascript arrays object


    【解决方案1】:

    const obj = {
      items: {
        1: {qty_auth: "", resolution: "4", status: "", order: "1495"},
        5: {qty_sized: "1", resolution: "4", status: "", order: "1485"}
      }
    };
    
    obj.items = Object.fromEntries(
      Object.entries(obj.items)
      .filter(([_, item]) =>
        Object.keys(item).some(key => key.startsWith('qty_') && item[key])
      )
    );
    
    console.log(obj);

    【讨论】:

    • 代码有效。但是我怎么能把它推到同一个 mydata.items 。因为我需要将该对象集推送到 API? @Majed
    【解决方案2】:

    您说的是数组,但使用大括号而不是方括号。为了 filter() 工作,它必须看起来像:

    mydata = {
       items: [
          {qty_auth: "", resolution: "4", status: "", order: "1495"},
          {qty_sized: "1", resolution: "4", status: "", order: "1485"}
       ]
    }
    

    假设它是一个实际的数组,“const mydatadata.items”仍然存在问题,或者至少它会给我一个错误,因为 mydatadata 没有初始化。除非它是一个错字并且它应该是 mydata,但是你会重新声明它。所以取决于你想要什么:

    mydata.items = mydata.items.filter((o) =>
            Object.keys(o).some((k) => k.startsWith("qty") && o[k])
    );
    

    let mydatadata = {};
    mydatadata.items = mydata.items.filter((o) =>
            Object.keys(o).some((k) => k.startsWith("qty") && o[k])
    );
    

    此外,您将结果存储在 mydatadata 中,但您正在记录变量结果。 所以取决于之前的答案:

    console.log(mydatadata);
    

    console.log(mydata);
    

    这是一个小提琴:https://jsfiddle.net/b57qa82d/

    【讨论】:

      【解决方案3】:

      您可能应该只使用数组而不是对象。当您不断更改术语来描述您的数据时,您的问题并不清楚您需要什么结构。例如:“现在mydata.items 有一个数组集”但您的代码说它应该是带有键的对象,而不是一个数组。

      所以我建议:将您的数据放入一个数组中,然后filter 通过遍历每个对象的条目并检查是否有任何以“qty”开头的键的值不是空字符串。然后,您可以将该过滤后的数组分配给 myObject.items

      const data = [
      { "qty_sized": "0", "resolution": "5", "status": "", "order": 2 },
      { "qty_auth": "", "resolution": "5", "status": "", "order": 3 },
      { "qty_auth": "1", "resolution": "5", "status": "", "order": 1342 },
      { "qty_sized": "", "resolution": "2", "status": "", "order": 1 },
      { "qty_sized": "1", "resolution": "1", "status": "", "order": 142 }];
      
      const filtered = data.filter(obj => {
        return Object.entries(obj).find(([key, value]) => {
          return key.startsWith('qty') && value;
        });
      });
      
      const myObject = { items: filtered };
      
      console.log(myObject);

      其他文档

      【讨论】:

        猜你喜欢
        • 2020-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-24
        • 1970-01-01
        • 1970-01-01
        • 2019-02-09
        • 1970-01-01
        相关资源
        最近更新 更多