reactjs Es6中使用随机数键过滤对象

tsm1rwdh  于 2023-03-22  发布在  React
关注(0)|答案(6)|浏览(182)

我有一个包含键和对象的对象。我正在尝试查看是否可以过滤掉并只返回符合条件的对象。这就是对象
随机数密钥将或可以不同。

{
    "0e93e707-e5aa-4d2b-91ab-a8dec97af344": {
        "Id": "0e93e707-e5aa-4d2b-91ab-a8dec97af344",
        "ExternalSecurityListId": null,
        "CreatorId": "557fa8b2-59db-430d-9595-cd17884c9151",
        "Name": "Chris",
        "PartnerName": null,
        "Type": "Watch",
        "CostBasis": 0,
        "Processing": false,
        "NotificationSettings": {
            "SourceId": "0e93e707-e5aa-4d2b-91ab-a8dec97af344",
            "SourceType": "SecurityList",
            "ChannelTypes": null,
            "NotificationFilters": []
        },
        "Owner": null,
        "SharingStatus": "None",
        "CreatedDate": "2023-02-01T20:31:21.848Z",
        "ModifiedDate": "2023-02-10T17:12:21.053Z",
        "IsGroup": false,
        "UnderlyingSecurityListIds": [],
        "MaturingSoon": false
    },
    "ed89d5a3-464b-4bd7-b9bb-e42ee87f6520": {
        "Id": "ed89d5a3-464b-4bd7-b9bb-e42ee87f6520",
        "ExternalSecurityListId": null,
        "CreatorId": "557fa8b2-59db-430d-9595-cd17884c9151",
        "Name": "Chris Portfolio Two",
        "PartnerName": null,
        "Type": "Portfolio",
        "CostBasis": 100000,
        "Processing": false,
        "NotificationSettings": {
            "SourceId": "ed89d5a3-464b-4bd7-b9bb-e42ee87f6520",
            "SourceType": "SecurityList",
            "ChannelTypes": null,
            "NotificationFilters": []
        },
        "Owner": null,
        "SharingStatus": "None",
        "CreatedDate": "2023-03-20T19:20:02.16Z",
        "ModifiedDate": "2023-03-20T19:20:17.117Z",
        "IsGroup": false,
        "UnderlyingSecurityListIds": [],
        "MaturingSoon": false
    },

}

我试过像这样按键过滤,但它没有返回任何结果。

const allowed = ['Portfolio'];
const filtered = Object.keys(portfoliosData)
  .filter(key => allowed.includes(key))
  .reduce((obj, key) => {
    obj[key] = portfoliosData[key];
    return obj;
  }, {});
const filtered = Object.keys(portfoliosData)
  .filter(key => allowed.includes(key))
  .reduce((obj, key) => {
    obj[key] = portfoliosData[key];
    return obj;
  }, {});

有什么想法或建议吗?

uz75evzq

uz75evzq1#

好的,根据您的评论,这是实现这一目标的一个选项:

Object.values(portfoliosData).filter(({Type}) => Type == "Portfolio")

它将只列出最上面的对象的值(而不是键),然后使用捕获属性Type的lambda迭代filter,并检查它是否等于预期值

bjp0bcyl

bjp0bcyl2#

假设你的JSON blob被赋值给portfoliosData变量,那么Object.keys(portfoliosData)将返回["0e93e707-e5aa-4d2b-91ab-a8dec97af344", "ed89d5a3-464b-4bd7-b9bb-e42ee87f6520"]。显然allowed数组不包含这两个键,所以你的过滤器(正确地)过滤掉了所有选项,并返回一个空数组。

pkwftd7m

pkwftd7m3#

这将把对象字典过滤成一个[key, object]数组:

const dictionary = {1: {Property: "correct"}, 2: {Property: "incorrect"}};
const correctObjects = [];
for (const key in dictionary) {
    const object = dictionary[key];
    if (object.Property === "correct") {
        correctObjects.push([key, object]);
    }
}
console.log(correctObjects);

输出:[ ["1", {"Property":"correct"}] ]

ryevplcw

ryevplcw4#

你可以遍历Object.keys(portfoliosData),然后对每个变量检查它们的投资组合类型,你的allowed变量似乎不符合你想要的应用工作方式。

keys = Object.keys(portfoliosData)
filtered = []
for (k of keys) {
    if (portfoliosData[k]['Type'] == 'Portfolio') {
        filtered.push(portfoliosData[k])
    }
}
rbpvctlc

rbpvctlc5#

看起来你的portfoliosData是一个Map,其中键是id,值是具有不同Type s的相应数据项。你想获得allowed列表中所有具有Type的项的列表。
你可以这样做:
const allowedItems = Object.entries(portfolioData).filter(item => allowed.includes(item.Type))
这种方法完全忽略了portfolioData的键,因为它们是随机的。Object.values返回您可以过滤的所有项的数组。

toe95027

toe950276#

我只是把这个放在一起,看看这是否有效。

const result = Object.values(data).filter((item) => item.Type === 'Portfolio')

我把你的示例数据放到了一个data const中。所以只要把数据改成你的源数据,这个就可以过滤它了。

相关问题