Фильтровать подмассив - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь отфильтровать мой массив, который имеет подмассив.я хочу отфильтровать мой массив по подмассиву, мой массив выглядит так:

 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
                        }
                    }
                ]
            }

        ]

Спасибо;)

Ответы [ 3 ]

0 голосов
/ 26 июня 2019

Вы можете отобразить объекты и отфильтровать 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);
0 голосов
/ 27 июня 2019

Используя 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();

Хотя Нина показывает, вам это не нужно, поскольку Array.map и Array.filter могут с этим справиться.

0 голосов
/ 26 июня 2019

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), []
));
...