【问题标题】:Filtering out results from a nested array从嵌套数组中过滤出结果
【发布时间】:2021-07-15 08:12:37
【问题描述】:

我有一个如下所示的数据集:

teams = [
    {
        "teamName": "Alpha",
        "members": [
            {
                "firstName": "John",
                "lastName": "Doe"
            },
            {
                "firstName": "Jane",
                "lastName": "Doe"
            }
        ]   
    },
    {
        "teamName": "Beta",
        "members": [
            {
                "firstName": "John",
                "lastName": "Doe"
            }
        ]   
    }
]

我正在尝试通过 firstName + lastName 组合对所述列表实施搜索功能。到目前为止,我已经尝试过:

searchTerm = 'John Doe';
teams.filter(team => 
   team.members.some(member => 
      (member.firstName + ' ' + member.lastName).includes(searchTerm)
   )
);

我希望它返回以下内容:

[
    {
        "teamName": "Alpha",
        "members": [
            {
                "firstName": "John",
                "lastName": "Doe"
            }
        ]   
    },
    {
        "teamName": "Beta",
        "members": [
            {
                "firstName": "John",
                "lastName": "Doe"
            }
        ]   
    }
]

但代码似乎返回了 John Doe 所属的团队,而没有将 Jane Doe 过滤掉。

关于我做错了什么有什么建议吗?

谢谢。

const teams = [
    {
        "teamName": "Alpha",
        "members": [
            {
                "firstName": "John",
                "lastName": "Doe"
            },
            {
                "firstName": "Jane",
                "lastName": "Doe"
            }
        ]   
    },
    {
        "teamName": "Beta",
        "members": [
            {
                "firstName": "John",
                "lastName": "Doe"
            }
        ]   
    }
]

searchTerm = 'John Doe';
console.log(teams.filter(team => 
   team.members.some(member => 
      (member.firstName + ' ' + member.lastName).includes(searchTerm)
   )
));

【问题讨论】:

  • 您的过滤器会过滤掉没有名为 John Doe 的成员的团队。它不会过滤团队成员。
  • 你的新"members": [ 完全没有意义。由于您已经知道要找谁,所以像 ["Alpha", "Beta"] 这样的简单结果似乎更好。或者更确切地说:{teams: [], member: {}}
  • 目前这个问题对我来说还不清楚。您是要仅过滤成员并始终列出所有团队,还是要过滤成员和团队。如果搜索Jane Doe,预期的结果是什么?
  • 我需要保留用户所属的前端团队,所以如果我要寻找 Jane Doe,我希望结果返回为:``` [ { " teamName": "Alpha", "members": [ { "firstName": "Jan", "lastName": "Doe" } ] } ] ```

标签: javascript arrays


【解决方案1】:

您可以使用mapfilter 来达到预期的效果。

const result = teams.map((t) => {
  return {
    ...t,
    members: t.members.filter(
      (m) => `${m.firstName} ${m.lastName}` === searchTerm
    ),
  };
});

const teams = [
  {
    teamName: "Alpha",
    members: [
      {
        firstName: "John",
        lastName: "Doe",
      },
      {
        firstName: "Jane",
        lastName: "Doe",
      },
    ],
  },
  {
    teamName: "Beta",
    members: [
      {
        firstName: "John",
        lastName: "Doe",
      },
    ],
  },
];

const searchTerm = "John Doe";

const result = teams.map((t) => {
  return {
    ...t,
    members: t.members.filter(
      (m) => `${m.firstName} ${m.lastName}` === searchTerm
    ),
  };
});

console.log(result);

【讨论】:

  • OP 添加了所有细节,他展示了他的尝试,我给出了两个解决方案
  • @RemiVainoris 我添加了两个解决方案
  • @GerasimosRagavanis:在回答历史中搜索const [first, last] = searchTerm.split(" "):如果某人的名字中有两个单词或姓氏中有两个单词怎么办?该解决方案很快就会失效。
【解决方案2】:

我用lodash解决了。

const searchTerm = 'John Doe'
const result = _.map(teams, elem => {
    elem.members = _.filter(elem.members, ({firstName, lastName}) => `${firstName} ${lastName}` === searchTerm);
    return elem;
});

console.log('result', result)

这是一个工作示例http://jsfiddle.net/9o8mx0rh/2/

【讨论】:

    【解决方案3】:

    请尝试这样做:

    searchTerm = 'John Doe';
    teams.map(team => 
       team.members.filter(member => 
          (member.firstName + ' ' + member.lastName).includes(searchTerm)
       )
    );
    

    【讨论】:

      猜你喜欢
      • 2016-10-29
      • 2022-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-18
      • 1970-01-01
      相关资源
      最近更新 更多