【问题标题】:Filter Sub array过滤子数组
【发布时间】:2019-11-08 05:15:23
【问题描述】:

我正在尝试过滤具有子数组的数组。 我想按子数组过滤我的数组 我的数组如下所示:

 var Branches = [
            {
                Name: 'branch1',
                Screens: [
                    {
                        Name: 'Screen1',
                        Player: {
                            Status: 0
                        }
                    },
                    {
                        Name: 'Screen2',
                        Player: {
                            Status: 1
                        }
                    }
                ]
            },
            {
                Name: 'branch2',
                Screens: [
                    {
                        Name: 'Screen1',
                        Player: {
                            Status: 0
                        }
                    },
                    {
                        Name: 'Screen2',
                        Player: {
                            Status: 1
                        }
                    }
                ]
            }]

我已经用 linq.js 试过了

var param = 1
var result = Enumerable.From(Branches).Where(function (d) {

                return (d.Screen.some(x => x.Player.Status === param))

            }).ToArray();

但是这段代码仍然从每个分支获取状态 0

我只想从每个分支获取状态 = 1

预期结果:

[
            {
                Name: 'branch1',
                Screens: [
                    {
                        Name: 'Screen2',
                        Player: {
                            Status: 1
                        }
                    }
                ]
            },
            {
                Name: 'branch2',
                Screens: [
                    {
                        Name: 'Screen2',
                        Player: {
                            Status: 1
                        }
                    }
                ]
            }

        ]

谢谢 ;)

【问题讨论】:

  • 如果里面没有Status: 1怎么办?你想得到父对象吗?还是只是过滤内部数组?
  • 是的,我想获取父对象以及已过滤的子对象
  • @NinaScholz 嗨,还有其他解决方案吗?谢谢

标签: javascript angularjs linq.js


【解决方案1】:

var Branches = [
  {
    Name: "branch1",
    Screens: [
      {
        Name: "Screen1",
        Player: {
          Status: 0
        }
      },
      {
        Name: "Screen2",
        Player: {
          Status: 1
        }
      }
    ]
  },
  {
    Name: "branch2",
    Screens: [
      {
        Name: "Screen1",
        Player: {
          Status: 0
        }
      },
      {
        Name: "Screen2",
        Player: {
          Status: 1
        }
      }
    ]
  }
];
var param = 1;
console.log(Branches.reduce( (p, c) => ((c.Screens = c.Screens
    .filter(s => s.Player.Status == param)).length && p.push(c), p), []
));

【讨论】:

  • 我收到错误:fis 没有定义,我尝试用 p 替换它,但我什么也没得到 :(
  • 你用的是什么浏览器?
  • 我用的是谷歌浏览器
  • 您好,分支屏幕在第一次过滤后被删除。例如:我想要状态:1,在下一个过滤器中我想要状态:0,但所有状态:0 都被删除了?
  • 对不起,我没听懂问题?
【解决方案2】:

您可以映射对象并过滤Screens。

var branches = [{ Name: 'branch1', Screens: [{ Name: 'Screen1', Player: { Status: 0 } }, { Name: 'Screen2', Player: { Status: 1 } }] }, { Name: 'branch2', Screens: [{ Name: 'Screen1', Player: { Status: 0 } }, { Name: 'Screen2', Player: { Status: 1 } }] }],
    wanted = 1,
    result = branches.map(({ Screens, ...o }) => ({ ...o, Screens: Screens.filter(({ Player: { Status } }) => Status === wanted) }));

console.log(result);

【讨论】:

  • 感谢这是我要找的。 ,你能解释一下语法'...o'是干什么用的吗?
  • ...o 获取对象的其余部分,而没有解构属性。
【解决方案3】:

使用 linq.js,您需要将其视为通过一组过滤的屏幕选择分支。您可能不想修改现有项目,因此应该创建新项目。

let status = 1;
let result = Enumerable.From(Branches)
    .Select(({Screens, ...rest}) => ({
        Screens: Enumerable.From(Screens)
            .Where(({Player:{Status}}) => Status === status)
            .ToArray(),
        ...rest
    })).ToArray();

虽然 Nina 显示,但您并不需要这个,因为 Array.map 和 Array.filter 可以处理这个。

【讨论】:

    猜你喜欢
    • 2017-10-29
    • 2017-02-14
    • 1970-01-01
    • 2016-05-02
    • 2019-08-10
    • 1970-01-01
    • 2021-06-17
    • 2019-02-15
    • 1970-01-01
    相关资源
    最近更新 更多