【问题标题】:Filtering a nested object in JavaScript using .filter and .reduce使用 .filter 和 .reduce 在 JavaScript 中过滤嵌套对象
【发布时间】:2018-07-24 03:34:26
【问题描述】:

我有这个对象是诊所,关键是诊所的 id,它有一个 id 和邀请:

const clinics = {
    "a0CW0000001K2F8MAK": {
        "id": "a0CW0000001K2F8MAK",
        "invitations": {
            "56205": {
              "id": "56205",
              "status": "Confirmed",
          },
        }
    },
    "a0CW00000026gjsMAA": {
        "id": "a0CW00000026gjsMAA",
        "invitations": {}
    },
    "a0CW00000026gjTMAQ": {
        "id": "a0CW00000026gjTMAQ",
        "invitations": {
            "56445": {
              "id": "56445",
              "status": "Cancelled",
          },
        }
    },
    "a0CW00000026gipMAA": {
        "id": "a0CW00000026gipMAA",
        "invitations": {
            "56447": {
                "id": "56447",
                "status": "Confirmed",
            },
            "56448": {
                "id": "56448",
                "status": "Cancelled",
            },
            "56456": {
                "id": "56456",
                "status": "Declined",
            }
        }
    },
    "a0CW00000026gjOMAQ": {
        "id": "a0CW00000026gjOMAQ",
        "invitations": {}
    },
    "a0CW00000026gjnMAA": {
        "id": "a0CW00000026gjnMAA",
        "invitations": {
          "56304": {
              "id": "56304",
              "status": "Pending",
          },
        }
    },
}

并且我只想在邀请 -> 状态等于“已取消”时返回对象,可能有多个邀请,如果任何邀请被取消,我需要返回该对象,在此案例,返回:

const clinics = {
    "a0CW00000026gjTMAQ": {
        "id": "a0CW00000026gjTMAQ",
        "invitations": {
            "56445": {
              "id": "56445",
              "status": "Cancelled",
          },
        }
    },
    "a0CW00000026gipMAA": {
        "id": "a0CW00000026gipMAA",
        "invitations": {
            "56447": {
                "id": "56447",
                "status": "Confirmed",
            },
            "56448": {
                "id": "56448",
                "status": "Cancelled",
            },
            "56456": {
                "id": "56456",
                "status": "Declined",
            }
        }
    },
}

我尝试了类似的方法,但没有成功:

function filterByStatus(clinics) {
  return Object.keys(clinics)
    .filter(clinicId => clinics[clinicId].invitations.status === "Cancelled")
    .reduce((acc, key) => Object.assign(acc, { [key]: clinics[key] }), {});
}

我该怎么做?谢谢!

【问题讨论】:

  • I tried something like this, but it didn't work - 是这样的,还是那样的?不要询问您尚未发布的代码。 “它没有用” - 以什么方式?你得到的输出是什么而不是你的预期

标签: javascript object filter reduce


【解决方案1】:

检查someinvitations 对象values 是否有statusCancelled。不需要filter,您可以通过在reduce 函数本身中进行测试来避免迭代两次:

const clinics={"a0CW0000001K2F8MAK":{"id":"a0CW0000001K2F8MAK","invitations":{"56205":{"id":"56205","status":"Confirmed",},}},"a0CW00000026gjsMAA":{"id":"a0CW00000026gjsMAA","invitations":{}},"a0CW00000026gjTMAQ":{"id":"a0CW00000026gjTMAQ","invitations":{"56445":{"id":"56445","status":"Cancelled",},}},"a0CW00000026gipMAA":{"id":"a0CW00000026gipMAA","invitations":{"56447":{"id":"56447","status":"Confirmed",},"56448":{"id":"56448","status":"Cancelled",},"56456":{"id":"56456","status":"Declined",}}},"a0CW00000026gjOMAQ":{"id":"a0CW00000026gjOMAQ","invitations":{}},"a0CW00000026gjnMAA":{"id":"a0CW00000026gjnMAA","invitations":{"56304":{"id":"56304","status":"Pending",},}},}

console.log(
  Object.entries(clinics).reduce((a, [key, val]) => {
    const { invitations } = val;
    if (Object.values(invitations).some(({ status }) => status === 'Cancelled')) {
      a[key] = val;
    }
    return a;
  }, {})
);

【讨论】:

  • 感谢@CertainPerformance 它有效!但是我的 linter 说“分配给函数参数'a'(no-param-reassign)的属性”是因为 a[key] = val;我该如何改变这个?
  • 这没什么好担心的——分配给累加器比每次迭代都创建一个新对象要高效得多。
猜你喜欢
  • 2021-01-15
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 2020-02-01
  • 2021-06-06
  • 1970-01-01
  • 2019-02-27
  • 2021-08-13
相关资源
最近更新 更多