ReactJS: Как предотвратить повторяющиеся значения в array.push? - PullRequest
0 голосов
/ 11 ноября 2019

При выборе одного параметра в поле «Выбор» остальные параметры становятся множественными значениями. Как я могу предотвратить это дублирование значений?

import Select from 'react-select';
const dataOptions = []; 
class App extends React.Component {
    constructor(props) {
        super(props);
        this.data = [];
        this.getData();
    }
    getData = () => { api.request({url: `/getdata`}).then(res => res.map(el => this.data[el.id] = el.name)) }

    addData = () => {
        const { selectedId } = this.state;
        var datas = this.data;
        console.log(datas);
        datas.map((name, index) => {
            if (!dataOptions.includes(name)) {
                console.log('b4 push:', dataOptions)
                dataOptions.push({ value: index, label: name });
                console.log('aftr push:', dataOptions)
            }
        });
        return (
            <Select options={dataOptions}
            isMulti
            />
        );
    }
}

Что-то не так происходит в этом синтаксисе:

datas.map((name, index) => {
  if (!dataOptions.includes(name)) {
       dataOptions.push({ value: index, label: name });
  }
}); 

Результаты консоли

[ "data-1", "data-2", "data-3"]

b4 push: [
  {value: 1, label: "data-1"}
  {value: 2, label: "data-2"}
  {value: 3, label: "data-3"}
]

aftr push: [
  {value: 1, label: "data-1"}
  {value: 2, label: "data-2"}
  {value: 3, label: "data-3"}
]

PS: здесь в aftrнажмите, я уже выбрал первый вариант из выпадающего списка;так в результате, если не должны отображаться в значениях массива.

Заранее спасибо ...!

1 Ответ

2 голосов
/ 11 ноября 2019

Синтаксис destructuring должен быть таким, как показано ниже

datas.map(({name, index}) => {
      if (!dataOptions.includes(name)) {
           dataOptions.push({ value: index, label: name });
      }
    }); 

Более того, вам не нужен внешний массив для передачи данных в функцию карты, так как функция по умолчанию возвращает массив, вы можете сделать это просто так:ниже

 let expected_data=datas.map(({name, index}) => {
              if (!dataOptions.includes(name)) {
                 return  { value: index, label: name };// return a value
              }
            }); 

expected_data будет содержать данные, которые вам нужны после операции

См. фрагмент-

let data = [{
  "name": 1,
  "index": 2
}, {
  "name": 11,
  "index": 21
}]

console.log(data.map(({
  index,
  name
}) => {

  return {
    value: index,
    label: name
  }

}))

Вам лучше использовать Array.some() для того, что вы ищете

 datas.map((name,index) => { // here index is the iterator
                if(!dataOptions.some(({value,label})=>label==name  ))
            {
                   dataOptions.push({ value: index, label: name });
              }
            }); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...