Удалить элементы в массиве с количеством 0 в React Native - PullRequest
1 голос
/ 09 января 2020

Я хочу удалить элементы в массиве с нулевым количеством. я попытался:

    constructor(props) {
    super(props);
    this.state = {
    serviceAvailed: [{"label": "Top", "quantity": 2}, {"label": "Bottoms", "quantity": 0}, 
    {"label": "Jacket", "quantity": 1}, {"label": "Beddings", "quantity": 0}, {"label": "Shoes", 
    "quantity": 0}];,
    }

На компоненте монтировался, я зациклил элементы внутри массива и вызвал метод removeItem, который должен удалить все элементы с нулевым количеством

   componentDidMount() {
    let {serviceAvailed  } = this.state;
    serviceAvailed = this.state.array.map((item, i) => {
    let quantity=parseInt(item.quantity);
       if(quantity<1){
       this.removeItem(i)
       }});
   }

Функция удалить массив

   removeItem(index) {
    const serviceAvailed = this.state.serviceAvailed;
    serviceAvailed.splice(index, 1);
    this.setState({ serviceAvailed });
    console.log(serviceAvailed)
   }

ожидаемый результат: serviceAvailed: [{"label": «Top», «amount»: 2}, {«label»: «Jacket», «amount»: 1} ];,

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Задача

array::map предназначена для отображения каждого элемента из массива в новый массив. Операция представляет собой однозначное соответствие . Он также предназначен для использования в качестве чистой функции, то есть имеет побочные эффекты ZERO , такие как удаление элементов массива, по которому он итерируется. array::reduce и array::filter - лучшие варианты для удаления элементов или иного «уменьшения» входных данных.

Решение

Использование array::filter позволяет перебирать через массив и вернуть новый массив, содержащий только элементов, которые проходят предикат фильтра. Создайте функцию предиката фильтра, которая возвращает истину или ложь, если свойство количества объекта больше, чем 0.

const quantityGreaterThanZero = ({ quantity }) => quantity > 0;

Примечание: 0 - это значение "falsey", числа больше 0 «истинные» значения, поэтому вышеприведенное можно упростить, чтобы просто вернуть количество. Если это правда, предикатная функция истинна, иначе она ложна.

const quantityGreaterThanZero = ({ quantity }) => quantity;

Теперь вы можете передать свою функцию предиката в качестве обратного вызова на array::filter.

const greaterThanZero = data.filter(quantityGreaterThanZero);

const data = [
  { label: "Top", quantity: 2 },
  { label: "Bottoms", quantity: 0 },
  { label: "Jacket", quantity: 1 },
  { label: "Beddings", quantity: 0 },
  { label: "Shoes", quantity: 0 }
];

const quantityGreaterThanZero = ({ quantity }) => quantity;

console.log(data.filter(quantityGreaterThanZero));
0 голосов
/ 09 января 2020

Вы можете использовать метод фильтра массива

let newArr = serviceAvailed.filter(function (e) {
        return e.quantity > 0;
    });
    console.log(newArr );
...