Обновление массива из AsyncStorage

#javascript #arrays #reactjs #react-native #asyncstorage

#javascript #массивы #reactjs #реагировать-родной #asyncstorage

Вопрос:

У меня есть массив вызываемых объектов audioBaby .

Когда приложение запускается, я проверяю asyncStorage , и если какой-либо ключ имеет значение active , я хочу обновить lock ключи в массиве.

То, что я сделал, — это обновление не всех объектов в массиве, а только последнего объекта.

Как я могу initially обновить массив asyncStorage и отобразить экран?

 const [audioBaby, setAudioBaby] = useState([
  {
    lock: "deactive",
    url: "item0.mp3",
  },
  {
    lock: "deactive",
    url: "item1.mp3",
  },
  {
    lock: "deactive",
    url: "item2.mp3",
  },
]);

useEffect(() => {
  try {
    AsyncStorage.multiGet([
      "babyAudio0Status", //value: active
      "babyAudio1Status", //value: active
      "babyAudio2Status", //value: active
    ]).then((response) => {
      let updatedList = audioBaby;
      if (response[0][1] != "null" amp;amp; response[0][1] == "active") {
        updatedList = audioBaby.map((item) => {
          if (item.url == "item0.mp3") {
            return { ...item, lock: "active" };
          }
          return item;
        });
      }
      if (response[1][1] != "null" amp;amp; response[1][1] == "active") {
        updatedList = audioBaby.map((item) => {
          if (item.url == "item1.mp3") {
            return { ...item, lock: "active" };
          }
          return item;
        });
      }
      if (response[2][1] != "null" amp;amp; response[2][1] == "active") {
        updatedList = audioBaby.map((item) => {
          if (item.url == "item2.mp3") {
            return { ...item, lock: "active" };
          }
          return item;
        });
      }
      setAudioBaby(updatedList)
    });
  } catch (error) {
    console.log("error::", error);
  }
}, []);
 

Конечный массив должен быть таким:

 [
    {
      lock: "active",
      url: "item0.mp3",
    },
    {
      lock: "active",
      url: "item1.mp3",
    },
    {
      lock: "active",
      url: "item2.mp3",
    },
]
 

Комментарии:

1. Было бы полезно посмотреть, как response выглядит после вашего multiGet . Кроме того, не связанный, вы должны использовать === not == и !== not != , если у вас нет веской причины.

2. Спасибо, я решил проблему и исправил равенства в соответствии с тем, что вы сказали.

Ответ №1:

Я переместил все if s внутрь map функции, и все в порядке.

   let updatedList = audioBaby.map((item) => {
          if (item.url === 'item0.mp3' amp;amp; response[0][1] === 'active') {
            return { ...item, lock: 'active' }
          }
          if (item.url === 'item1.mp3' amp;amp; response[1][1] === 'active') {
            return { ...item, lock: 'active' }
          }
          if (item.url === 'item2.mp3' amp;amp; response[2][1] === 'active') {
            return { ...item, lock: 'active' }
          }
          return item
        })