Как фильтровать данные с помощью lodash - PullRequest
0 голосов
/ 23 мая 2019

У меня есть следующий код:

data = [
  {id: "15130", state: "INITIAL"},
  {id: "15129", state: "LOCKED"},
  {id: "10314", state: "APPROVED"},
  {id: "51", state: "APPROVED"},
  {id: "10313", state: "APPROVED_LOCKED"},
  {id: "10315", state: "APPROVED_LOCKED"}
]

filters = [{id: "2", name: "LOCKED", count: 2}]

let result = []

_.forEach(data, (ca) => {  
  if (filters.length > 0) {
    if (!_.some(filters, (item) => item.name === ca.state.includes('LOCKED') ? "LOCKED" : ca.state))
      return;
  }
  result.push(ca);
});

console.log(result)

Я хочу получить все записи из данных, где состояние включает "LOCKED".Таким образом, результат должен быть:

result = [
  {id: "15129", state: "LOCKED"},
  {id: "10313", state: "APPROVED_LOCKED"},
  {id: "10315", state: "APPROVED_LOCKED"}
]

Но я получаю все записи в результате.

Вот скрипка.

Любая идея, что я делаюнеправильно?

Ответы [ 5 ]

2 голосов
/ 23 мая 2019

Нет необходимости в Lodash, вы можете использовать Array.filter () Vanilla JavaScript, за которым следует Array.include () , которое проверяет, содержит ли строковое значение в stateстрока 'LOCKED'.

const data = [
  {id: "15130", state: "INITIAL"},
  {id: "15129", state: "LOCKED"},
  {id: "10314", state: "APPROVED"},
  {id: "51", state: "APPROVED"},
  {id: "10313", state: "APPROVED_LOCKED"},
  {id: "10315", state: "APPROVED_LOCKED"}
]

const res = data.filter(obj => obj['state'].includes('LOCKED'));

console.log(res);

Однако учтите, что Array.includes () не так широко поддерживается .

0 голосов
/ 23 мая 2019

Вы можете использовать чистый JS:

 

const data = [
  {id: "15130", state: "INITIAL"},
  {id: "15129", state: "LOCKED"},
  {id: "10314", state: "APPROVED"},
  {id: "51", state: "APPROVED"},
  {id: "10313", state: "APPROVED_LOCKED"},
  {id: "10315", state: "APPROVED_LOCKED"}
];

const res = data.filter(({ state }) => state.includes("LOCKED"));

console.log(res);
 

.as-console-wrapper { max-height: 100% !important; top: auto; }
0 голосов
/ 23 мая 2019

Как это сделать с lodash:

Поскольку вам не нужно изменять исходный массив, вы можете использовать _. Filter . Обязательными аргументами являются входной массив и предикат, который будет использоваться для фильтрации предоставленного массива.

    const data = [
      {id: "15130", state: "INITIAL"},
      {id: "15129", state: "LOCKED"},
      {id: "10314", state: "APPROVED"},
      {id: "51", state: "APPROVED"},
      {id: "10313", state: "APPROVED_LOCKED"},
      {id: "10315", state: "APPROVED_LOCKED"}
    ]

    const result = _.filter(data, (elem => {return elem.state.includes("LOCKED")}));

    console.log(result);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>

Если вы хотите изменить исходный массив, опция _.remove является опцией.

0 голосов
/ 23 мая 2019
const allowedStatus = ["APPROVED_LOCKED", "LOCKED" ];

data.filter(filter => allowedStatus.includes(filter.state));

Вы можете иметь массив с разрешенным статусом и фильтровать данные по нему.Попробуйте приведенный выше код.

0 голосов
/ 23 мая 2019

Вы можете фильтровать массив, проверяя каждый name массива фильтров.

var data = [{ id: "15130", state: "INITIAL" }, { id: "15129", state: "LOCKED" }, { id: "10314", state: "APPROVED" }, { id: "51", state: "APPROVED" }, { id: "10313", state: "APPROVED_LOCKED" }, { id: "10315", state: "APPROVED_LOCKED" }],
    filters = [{ id: "2", name: "LOCKED", count: 2 }, { id: "1", name: "APPROVED", count: 2 }],
    result = data.filter(({ state }) => filters.some(({ name }) => state.includes(name)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...