如何更新数组中的json对象?

时间:2017-10-31 17:46:00

标签: javascript json reactjs array-map

我有一个对象数组,我想更新一些内容。我想我可以通过对象进行映射,找到我正在寻找的匹配,然后更新它。

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”。

5 个答案:

答案 0 :(得分:2)

data.map(obj => {
  return this.state.objToFind === obj.title;   
})

第一个地图将返回一个真假数组, 第二个地图将遍历这些值,console.log("found " + obj.title)将打印"找到+未定义"因此。

也许你想要这样的东西。

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;
 });

答案 1 :(得分:1)

将其更改为其他变量而不是obj,因为它引用了父 an array 的父 obj 。也可以在第一个返回数组的函数中使用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;
 });

答案 2 :(得分:1)

Map用于返回变异对象。使用地图时,您需要返回一些内容,在您的案例中修改对象。

然而,有些事情你做错了。 1)你正在使用.map来搜索某些东西(那不是你如何使用地图);尝试使用.filter或.find 2)使用map(在第二个函数中)更新对象后,需要将其返回。 案例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;

答案 3 :(得分:1)

如果您只想处理那些使this.state.objToFind === obj.title为真的元素,那么您需要Array.filter

data = data.fiter(obj => {
   return this.state.objToFind === obj.title;   
   }).map(obj, idx) => {
      console.log("found " + obj.title);     // reads found + undefined?
     ...
 });

答案 4 :(得分:1)

EVEN SIMPLER

你可以使用some运算符。 (它通过迭代数组来工作,当你返回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
   }
});