Как фильтровать значения объектов с помощью es6 - PullRequest
3 голосов
/ 11 октября 2019

У меня есть 2 объекта, которые я не хочу выполнять фильтрацией с помощью es6

. Сначала это мой объект данных, а второй выбрал некоторые данные.

Я не хочу получать все элементы в объекте данных, которые имеют значения второго объекта

let data = [
  {
    id: 1,
    name: 'A',
    status: 1
  },
  {
    id: 2,
    name: 'B',
    status: 1
  },
  {
    id: 3,
    name: 'C',
    status: 3
  },
  {
    id: 4,
    name: 'D',
    status: 2
  }
]

, а второй объект:

let selectedStatus = [
  {
    id: 1,
    status: 1
  },
  {
    status: 3
  }
]

в этом случае я хочу'чтобы получить объекты данных, которые содержат те же статусы во втором объекте, поэтому в этом случае мне нужно получить такой результат:

data = [
  {
    id: 1,
    name: 'A',
    status: 1
  },
  {
    id: 2,
    name: 'B',
    status: 1
  },
  {
    id: 3,
    name: 'C',
    status: 3
  },
]

Ответы [ 5 ]

1 голос
/ 11 октября 2019

Вы можете сделать так:

data = data.filter(item =>
  selectedStatus.map(s => s.status).includes(item.status)
);
0 голосов
/ 11 октября 2019

Если вы хотите создать третий список, например, ожидаемый результат, вы можете создать белый список для сопоставления.

const whiteList = selectedStatus.map((sel) => sel.status); // which gives you an array of all selected status you want to filter for

const filteredData = data.filter((data) => ~whiteList.indexOf(data.status)); // please consider that filter returns a new array that contain all items where the condition was falsy. That can be confusing.

, чтобы понять оператор ~, отметьте https://wsvincent.com/javascript-tilde/

Вы можете бороться с результатом отфильтрованного массива. Обратите внимание, что array.filter возвращает новый массив, который содержит все элементы, которые НЕ соответствуют условию, другими словами, это отрицание. Это может сбивать с толку. https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

ES7

const filteredData = data.filter((data) => whiteList.includes(data.status));
0 голосов
/ 11 октября 2019

Если у вас нет ограничений браузера, вы можете использовать их, используя Array.includes () для проверки статусов на data, которые на selectedStatus, затем Array.filter () для фильтрации объектов, соответствующих требуемому условию.

const data = [
  {
    id: 1,
    name: 'A',
    status: 1
  },
  {
    id: 2,
    name: 'B',
    status: 1
  },
  {
    id: 3,
    name: 'C',
    status: 3
  },
  {
    id: 4,
    name: 'D',
    status: 2
  }
]

const selectedStatus = [
  {
    id: 1,
    status: 1
  },
  {
    status: 3
  }
];

const res = data.filter(obj => selectedStatus.map(s => s.status).includes(obj.status));

console.log(res);
0 голосов
/ 11 октября 2019

Ниже фрагмент даст ожидаемый ответ:

var result = [];
data.forEach((value) => {
    selectedStatus.forEach(val => {
        if(value.status == val.status) { 
            result.push(value) 
        } 
    }); 
});
console.log(result)
0 голосов
/ 11 октября 2019
let result = [];    
selectedStatus.forEach(selectedStatus => result = result.concat(data.filter(status => status.status === selectedStatus.status)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...