Отображать только уникальные метки в React Native Picker - PullRequest
0 голосов
/ 03 июля 2018

У меня есть JSON, к которому также можно получить доступ через http://myjson.com/kfd04

{
  "response": [
    {
      "id": "1",
      "customer": "Star Wars",
      "project": "1977"
    },
    {
      "id": "2",
      "customer": "Star Wars",
      "project": "1985"
    },
    {
      "id": "3",
      "customer": "The Matrix",
      "project": "1999"
    },
    {
      "id": "4",
      "customer": "Inception",
      "project": "2010"
    },
    {
      "id": "5",
      "customer": "Interstellar",
      "project": "2014"
    }
  ]
}

Я хочу показывать только уникальных клиентов, пока это мой код. Он отображает всех клиентов. responseData содержит массив объектов response.

<Picker
  mode="dialog"
  selectedValue={this.state.customerName}
  onValueChange={(itemValue, itemIndex) => {
    this.setState({ customerName: itemValue });
    }
  }
  >
    {
      this.state.responseData.map((item) => (
      <Picker.Item label={item.customer} value={item.customer} key={item.customer} />))
    }
</Picker>

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Вы можете использовать filter и проверить, имеет ли первое вхождение фильма с определенным customer то же значение index, что и текущее index цикла. Таким образом, вы получите только все уникальные.

const movies = [
  {
    id: "1",
    customer: "Star Wars",
    project: "1977"
  },
  {
    id: "2",
    customer: "Star Wars",
    project: "1985"
  },
  {
    id: "3",
    customer: "The Matrix",
    project: "1999"
  },
  {
    id: "4",
    customer: "Inception",
    project: "2010"
  },
  {
    id: "5",
    customer: "Interstellar",
    project: "2014"
  }
];

const uniqueMovies = movies.filter((movie, index) => {
  return movies.findIndex(m => m.customer === movie.customer) === index;
});

console.log(uniqueMovies);
0 голосов
/ 03 июля 2018

Вы можете использовать следующую функцию, например uniqueArray = removeDuplicates(response, 'customer')

function removeDuplicates(myArr, prop) {
    return myArr.filter((obj, pos, arr) => {
        return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos;
    });
}
0 голосов
/ 03 июля 2018

Вам нужно уменьшить ваш массив, чтобы отфильтровать уникальные значения, для этого вы можете использовать метод Reduce

const data = {
  "response": [
    {
      "id": "1",
      "customer": "Star Wars",
      "project": "1977"
    },
    {
      "id": "2",
      "customer": "Star Wars",
      "project": "1985"
    },
    {
      "id": "3",
      "customer": "The Matrix",
      "project": "1999"
    },
    {
      "id": "4",
      "customer": "Inception",
      "project": "2010"
    },
    {
      "id": "5",
      "customer": "Interstellar",
      "project": "2014"
    }
  ]
}
const arr = data.response.reduce((acc, item) => {
   if(!acc.includes(item.customer)) {
      acc.push(item.customer);
   }
   return acc;
}, [])

console.log(arr);

и затем вы можете сделать это как

render() {

   const reducedArr = this.getUniqueValues();
   return (
         <Picker
            mode="dialog"
            selectedValue={this.state.customerName}
            onValueChange={(itemValue, itemIndex) => {
              this.setState({ customerName: itemValue });
              }
            }
            >
              {
                reducedArr.map((customer) => (
                <Picker.Item label={customer} value={customer} key={customer} />))
              }
            </Picker>
      )
}

или

const data = {
  "response": [
    {
      "id": "1",
      "customer": "Star Wars",
      "project": "1977"
    },
    {
      "id": "2",
      "customer": "Star Wars",
      "project": "1985"
    },
    {
      "id": "3",
      "customer": "The Matrix",
      "project": "1999"
    },
    {
      "id": "4",
      "customer": "Inception",
      "project": "2010"
    },
    {
      "id": "5",
      "customer": "Interstellar",
      "project": "2014"
    }
  ]
}
const arr = data.response.reduce((acc, item) => {
   if(!acc[item.customer]) {
      acc[item.customer] = 1;
   }
   return acc;
}, {})

console.log(arr);

и затем вы можете сделать это как

render() {

   const reducedObject = this.getUniqueValues();
   return (
         <Picker
            mode="dialog"
            selectedValue={this.state.customerName}
            onValueChange={(itemValue, itemIndex) => {
              this.setState({ customerName: itemValue });
              }
            }
            >
              {
                Object.keys(reducedObject).map((customer) => (
                <Picker.Item label={customer} value={customer} key={customer} />))
              }
            </Picker>
      )
}

или для фильтрации уникальных значений, вы также можете использовать Javascript Set

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...