有很多方法可以解决这个问题,但这里有一个。
首先,将您的 JSON 解析为对象数组。
数组的每个元素将如下所示:
{
connection: '98374',
db: '8',
timestamp: '159905411631'
event: 'DataCatch',
data: [
{ key: 'ruleid', value: '111' },
{ key: 'responseid', value: '155-response-4' },
{ key: 'responsetype', value: 'Capture' },
{ key: 'reason', value: 'ClientVisit' },
{ key: 'subreason', value: '' },
{ key: 'score', value: '0.00' },
{ key: 'comment', value: '' },
],
}
让我们调用我们的对象数组allData,以便我们稍后引用它。
现在我们可以开始我们的“手术”了。
我们将从内到外进行工作,首先查看需要对元素的 data 数组中的特定条目执行什么操作。
这里有一个函数可以满足我们的需要:
function updateReason(entry) {
if (entry.key === 'reason') {
return { ...entry, value: 'test' };
} else {
return entry;
}
}
此函数检查提供的条目是否有一个值为'reason' 的key,如果是,则返回一个与提供的条目相同的新 条目,除了它的值为'test'。
我们如何使用它来更新整个data 数组(即在具有数据的条目中)?
我们只是将工作委托给我们亲爱的朋友map:
function updateData(data) {
// or simply `data.map(updateEntry);`
return data.map(entry => updateEntry(entry));
}
我们正在慢慢地“向外”工作。
更新我们的 allData 大数组(可能包含也可能不包含数据)中的整个条目怎么样?
// I've called such an entry a "collection", because I already used the name
// "entry" above :(
// A "collection" is just an entry in the big `allData` array.
function updateCollection(collection) {
if (collection.event === 'DataCatch') {
return {
...collection, // Leave everything else the way it is
data: updateData(collection.data), // But update the `data` array
};
} else {
return collection;
}
}
如此接近。
我们需要做的最后一件事是将此转换应用于已解析的 allData 数组的每个元素:
// or `allData.map(updateCollection);`
const updatedData = allData.map(collection => updateCollection(collection));
还有:
问:改变条目不是更便宜吗?
A:它会更便宜,但不会那么便宜很多,因为这里发生了大量的“结构共享”。我会推荐这种方法,除非您出于某种原因需要改变您的输入,或者性能要求需要它。