Home > Blockchain >  remove object from array using an id before saving it in local storage in react native
remove object from array using an id before saving it in local storage in react native

Time:01-02

I am saving few data as an object in array in my local storage using AsyncStorage, I am able to do it in following way:

const [saveData, setSaveData] = useState([]);

useEffect(() => {
  AsyncStorage.setItem('test4', JSON.stringify(saveData))
    .then(json => console.log('success!'))
    .catch(error => console.log('error!'));
}, [saveData]);


const _submitWithWeather = async text => {
  let date = new Date();
  const curDate = moment(date).format('MMM DD');
  let newItem;

  newItem = {
    id: curDate,
    date: curDate,
    description: text,
    imageURL: photo,
    location: getLocation,
    temperature: getWeather,
    weatherType: geType,
  };

  setSaveData(prevList => {
    prevList = prevList || [];
    if (prevList.length < 0) {
      return newItem;
    } else {
      return [...prevList, newItem];
    }
  });
};

<TouchableOpacity
  onPress={() => {
    _submitWithWeather(text);
  }}>
  <Text>save</Text>
</TouchableOpacity>

I am passing today's date as an id, because if the date on which I am saving my data, matches an object with same date then it should replace the object from array whose date is also today's data.

for example:

[
  {
    "date": "Jan 02", 
    "description": "1", 
    "id": "Jan 02", 
    "imageURL": "urlImage.jpg", 
    "location": "location", 
    "temperature": "13°C", 
    "weatherType": "Clear"
  }
]

today's date is jan 02, and if I change the description or image and then click save , then this new object should replace the older object whose date is also jan 02

CodePudding user response:

You can achieve this by using Array.filter to filter out based on your Id prop and spread operator to bring it back together.

const d1 = [
{
    date: 'Jan 01',
    description: '1',
  },
  {
    date: 'Jan 02',
    description: '2',
  },
];

const d2 = {
  date: 'Jan 01',
  description: 'abc',
};

  const getData = () => {
    const d1WithoutDateToUpdate = d1.filter((d) => d.date != d2.date);
    const updatedD1 = [...d1WithoutDateToUpdate, d2];

    return updatedD1;
  };

CodePudding user response:

You could do a simple Array#map to update the data.

  setSaveData(prevList => {
    if (prevList.length) {
        return prevList.map(obj => (newItem.date === obj.date) ? newItem : obj);
    }
    return [newItem]
  });

As you've already initialized the value you don't need to set prevList = prevList || []

  • Related