Ваша функция обновления будет выглядеть так
updateItem(id, itemAttributes) {
var index = this.state.items.findIndex(x=> x.id === id);
if (index === -1)
// handle error
else
this.setState({
items: [
...this.state.items.slice(0,index),
Object.assign({}, this.state.items[index], itemAttributes),
...this.state.items.slice(index+1)
]
});
}
И вы используете ее так
this.updateItem(2, {someattr: 'a new value'});
Gross right?
Но у вас будет большая головная боль вообще, если вы продолжите строить сложное приложение таким образом. Вы действительно должны изучить redux или другую реализацию Flux, которая лучше подходит для решения этих проблем.
Redux использует концепцию редукторов состояния, каждая из которых работает на определенном фрагменте состояние вашей заявки. Таким образом, вам не нужно вручную копать все ваше состояние каждый раз, когда вы хотите повлиять на глубокие изменения.
Создатель Redux, Дэн Абрамов, сделал два видеокурса онлайн бесплатно. Дэн - отличный учитель, и я чувствовал себя комфортно с рисунком Редукса, проведя всего один день с ним.
Наилучший вариант состоит в том, чтобы просто открыть исходный файл для чтения, целевой файл для записи и затем цикла, копируя его блок блоком. В псевдокоде:
f1 = open(filename1);
f2 = open(filename2, "w");
while( !f1.eof() ) {
buffer = f1.read(buffersize);
err = f2.write(buffer, buffersize);
if err != NO_ERROR_CODE
break;
}
f1.close(); f2.close();
[Редактирование Аскером] хорошо, это - то, как это смотрит в C# (это медленно, но это, кажется, работает хорошо, и это дает прогресс):
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace LoopCopy
{
class Program
{
static void Main(string[] args)
{
if (args.Length != 2)
{
Console.WriteLine(
"Usage: LoopCopy.exe SourceFile DestFile");
return;
}
string srcName = args[0];
string destName = args[1];
FileInfo sourceFile = new FileInfo(srcName);
if (!sourceFile.Exists)
{
Console.WriteLine("Source file {0} does not exist",
srcName);
return;
}
long fileLen = sourceFile.Length;
FileInfo destFile = new FileInfo(destName);
if (destFile.Exists)
{
Console.WriteLine("Destination file {0} already exists",
destName);
return;
}
int buflen = 1024;
byte[] buf = new byte[buflen];
long totalBytesRead = 0;
double pctDone = 0;
string msg = "";
int numReads = 0;
Console.Write("Progress: ");
using (FileStream sourceStream =
new FileStream(srcName, FileMode.Open))
{
using (FileStream destStream =
new FileStream(destName, FileMode.CreateNew))
{
while (true)
{
numReads++;
int bytesRead = sourceStream.Read(buf, 0, buflen);
if (bytesRead == 0) break;
destStream.Write(buf, 0, bytesRead);
totalBytesRead += bytesRead;
if (numReads % 10 == 0)
{
for (int i = 0; i < msg.Length; i++)
{
Console.Write("\b \b");
}
pctDone = (double)
((double)totalBytesRead / (double)fileLen);
msg = string.Format("{0}%",
(int)(pctDone * 100));
Console.Write(msg);
}
if (bytesRead < buflen) break;
}
}
}
for (int i = 0; i < msg.Length; i++)
{
Console.Write("\b \b");
}
Console.WriteLine("100%");
Console.WriteLine("Done");
}
}
}
Если Вы хотите написать код, один способ, которым можно оптимизировать, отправляет файл в блоках (как использование MTOM). Я использовал этот подход для отправки вниз огромных файлов от DataCenter вниз в наш офис для печати..
Кроме того, проверьте утилиту TeraCopy, упомянутую здесь..