如何更新数组内的 json 对象?
How can I update a json object inside of an array?
我有一个对象数组,我想更新其中的一些内容。我想我可以通过对象映射,找到我正在寻找的匹配项,而不是更新它。
data = data.map(obj => {
return this.state.objToFind === obj.title;
}).map(obj, idx) => {
console.log("found " + obj.title); // reads found + undefined?
obj.menu = this.state.menu;
obj.title = this.state.title;
obj.content = this.state.content;
});
但是,这不起作用。我找到了对象,但 obj.anything 未定义。我的 console.log 显示为 "Found undefined"。
将其更改为其他变量而不是 obj,因为它引用父 obj,即 an array
。在将 return 数组
的第一个函数中也使用 array.filter
data = data.filter(obj => {
return this.state.objToFind === obj.title;
}).map(newval, idx) => {
console.log("found " + newval.title);
newval.menu = this.state.menu;
newval.title = this.state.title;
newval.content = this.state.content;
});
Map 用于 return 变异对象。使用地图时,您需要 return 返回一些东西,在您的情况下是修改后的对象。
但是有些事情你做错了。
1) 您正在使用 .map 搜索内容(这不是您使用地图的方式);尝试使用 .filter 或 .find
2) 在使用 map 更新你的对象后(在第二个函数中),你需要 return 它回来。
案例 1:
data = data.filter(obj => {
return this.state.objToFind === obj.title;
}).map(foundObj, idx) => {
console.log("found " + foundObj.title);
foundObj.menu = this.state.menu;
foundObj.title = this.state.title;
foundObj.content = this.state.content;
return foundObj; //updated obj
});
案例 2:
var foundObj = data.find(obj => {
return this.state.objToFind === obj.title;
});
console.log("found " + foundObjs.title);
foundObjs.menu = this.state.menu;
foundObjs.title = this.state.title;
foundObjs.content = this.state.content;
如果您只想处理那些使 this.state.objToFind === obj.title
为真的元素,那么 Array.filter
就是您所需要的
data = data.filter(obj => {
return this.state.objToFind === obj.title;
}).map(obj, idx) => {
console.log("found " + obj.title); // reads found + undefined?
...
});
data.map(obj => {
return this.state.objToFind === obj.title;
})
第一张图会return一个true和false的数组,
第二张地图将遍历这些值,console.log("found " + obj.title)
将因此打印 "found + undefined"。
也许你想要这样的东西。
data = data.filter(obj => {
return this.state.objToFind === obj.title;
}).map(obj, idx) => {
console.log("found " + obj.title);
obj.menu = this.state.menu;
obj.title = this.state.title;
obj.content = this.state.content;
return obj;
});
更简单
您可以使用 some 运算符。 (它通过遍历数组来工作,当你 return true 时它会跳出循环)
data.some(function(obj){
if (obj.title ==== 'some value'){
//change the value here
obj.menu = 'new menu';
obj.title = 'new title';
return true; //breaks out of he loop
}
});
我有一个对象数组,我想更新其中的一些内容。我想我可以通过对象映射,找到我正在寻找的匹配项,而不是更新它。
data = data.map(obj => {
return this.state.objToFind === obj.title;
}).map(obj, idx) => {
console.log("found " + obj.title); // reads found + undefined?
obj.menu = this.state.menu;
obj.title = this.state.title;
obj.content = this.state.content;
});
但是,这不起作用。我找到了对象,但 obj.anything 未定义。我的 console.log 显示为 "Found undefined"。
将其更改为其他变量而不是 obj,因为它引用父 obj,即 an array
。在将 return 数组
data = data.filter(obj => {
return this.state.objToFind === obj.title;
}).map(newval, idx) => {
console.log("found " + newval.title);
newval.menu = this.state.menu;
newval.title = this.state.title;
newval.content = this.state.content;
});
Map 用于 return 变异对象。使用地图时,您需要 return 返回一些东西,在您的情况下是修改后的对象。
但是有些事情你做错了。 1) 您正在使用 .map 搜索内容(这不是您使用地图的方式);尝试使用 .filter 或 .find 2) 在使用 map 更新你的对象后(在第二个函数中),你需要 return 它回来。 案例 1:
data = data.filter(obj => {
return this.state.objToFind === obj.title;
}).map(foundObj, idx) => {
console.log("found " + foundObj.title);
foundObj.menu = this.state.menu;
foundObj.title = this.state.title;
foundObj.content = this.state.content;
return foundObj; //updated obj
});
案例 2:
var foundObj = data.find(obj => {
return this.state.objToFind === obj.title;
});
console.log("found " + foundObjs.title);
foundObjs.menu = this.state.menu;
foundObjs.title = this.state.title;
foundObjs.content = this.state.content;
如果您只想处理那些使 this.state.objToFind === obj.title
为真的元素,那么 Array.filter
就是您所需要的
data = data.filter(obj => {
return this.state.objToFind === obj.title;
}).map(obj, idx) => {
console.log("found " + obj.title); // reads found + undefined?
...
});
data.map(obj => {
return this.state.objToFind === obj.title;
})
第一张图会return一个true和false的数组,
第二张地图将遍历这些值,console.log("found " + obj.title)
将因此打印 "found + undefined"。
也许你想要这样的东西。
data = data.filter(obj => {
return this.state.objToFind === obj.title;
}).map(obj, idx) => {
console.log("found " + obj.title);
obj.menu = this.state.menu;
obj.title = this.state.title;
obj.content = this.state.content;
return obj;
});
更简单
您可以使用 some 运算符。 (它通过遍历数组来工作,当你 return true 时它会跳出循环)
data.some(function(obj){
if (obj.title ==== 'some value'){
//change the value here
obj.menu = 'new menu';
obj.title = 'new title';
return true; //breaks out of he loop
}
});