【问题标题】:How to search and replace value in array of object literals如何在对象文字数组中搜索和替换值
【发布时间】:2016-09-30 07:18:23
【问题描述】:

我一直试图弄清楚如何在这样的对象数组中简单地搜索和替换一个值(在这种情况下,将任何等于 null 的值替换为未定义) - 数组键可能会有所不同:

var array = [{ 
  "name": "mike",
  "age": null
},
{ "name": "jim",
  "age": 99
}];

预期结果:

var array = [{ 
    "name": mike,
    "age": undefined
  },
  { "name": jim,
    "age": 99
  }];

我的印象是我应该能够使用 map() 函数来做到这一点,但没有一个文档示例对我来说很有意义。我一直在尝试应用这个问题的解决方案:https://stackoverflow.com/a/5915891/2930969 但没有任何成功。

无论如何,如果有人愿意帮助我指出正确的方向,这里有一个框架式的代码笔,您可以修改:http://codepen.io/anon/pen/zBxwdj?editors=0012

【问题讨论】:

  • 您的预期结果是什么..?
  • 如果有有效的 json 会有所帮助,mikejim 未定义。
  • @PranavCBalan 更新
  • @Ultimater 公平点,已修复
  • 睡着了,早上会重温这个。谢谢。

标签: javascript arrays


【解决方案1】:

由于您说键可能会有所不同,因此您需要执行两个循环来覆盖任意键名。一个数组,然后一个对象的键。

var nullToUndef = function (a) {
    return a.map(function (o) {
     Object.keys(o).forEach(function (key) {
       if (o[key] === null) {
         o[key] = undefined;
       }
      });
      return o;
    });
  },
  array = [
    { 
      "name": "mike",
      "age": null
    },
    { "name": "jim",
      "age": 99
    },
    {"foo": null,
    "bar": null
    }
  ];

console.log(nullToUndef(array));

jsFiddle

nullToUndef 使用Array.prototype.map 创建一个新数组,在映射函数内部,它使用Object.keys 获取每个对象的键名列表。然后检查每个属性值是否为null,并将null 属性更改为undefined,然后返回新数组的对象。

【讨论】:

    【解决方案2】:

    var array = [{ 
      "name": "mike",
      "age": null
    },
    { "name": "jim",
      "age": 99
    }];
    
    array = array.map(function(item) {
      if(item.age === null) {
        // delete item.age;
        item.age = undefined;
      }
      
      return item;
    });
    
    console.log(array);

    【讨论】:

    • 这非常接近我的想法。通过将 'item.name === mike' 切换为 'item.age === null',我能够得到我想要的结果 - 如果您切换它,我会将其标记为正确
    【解决方案3】:

    使用forEch()方法迭代更新

    var array = [{
      "name": "mike",
      "age": null
    }, {
      "name": "jim",
      "age": 99
    }];
    
    array.forEach(function(v) {
      v.age === null && (v.age = undefined)
      //or
      // if(v.age === null) v.age = undefined
    })
    
    console.log(array);

    【讨论】:

      【解决方案4】:

      使用一些唯一/可区分的属性(在这种情况下为名称?id 在这里很有帮助)过滤您的数组,然后直接更新对象:

      var mike = array.filter(function(obj) { return obj.name === 'mike' })[0];
      mike.age = undefined;
      

      【讨论】:

        【解决方案5】:

        试试看,

        更新为仅更改名称为“mike”且年龄为 NULL 的值。

        注意:最好在使用之前检查对象中是否存在属性。

        var array = [{ 
              "name": "mike",
              "age": null
            },
            { "name": "jim",
              "age": 99
            }];
        
        var arr = [];
        
        arr = array.map(function(x) { 
                      if(x.hasOwnProperty("age") && x.hasOwnProperty("name") && x["age"] == null && x["name"] == "mike")
                                    x["age"] = undefined;
          return x;
                                  });
        
        console.log(arr);

        【讨论】:

        • 似乎将所有“年龄”替换为未定义的值,即使它没有以 null 开头
        • 来自 OP 问题:在这种情况下,将 null 替换为 undefined
        • 抱歉,可能不清楚,不想让所有的“年龄”值都未定义,只是那些原本为空的值
        【解决方案6】:

        还有reduce方式。

        var arr = [{ 
          "name": "mike",
          "age": null
        },
        { "name": "jim",
          "age": 99
        }],
          fixed = arr.reduce((p,c) => (c.age === null && (c.age = void 0), p.concat(c)),[]);
        console.log(fixed);

        【讨论】:

          【解决方案7】:

          最短的代码如下

          array.map(a => (a.age = a.age === null ? undefined : a.age))
          
          console.log(array)
          

          【讨论】:

            猜你喜欢
            • 2012-01-29
            • 2021-07-01
            • 2020-08-20
            • 1970-01-01
            • 1970-01-01
            • 2017-05-11
            • 2019-11-07
            • 2012-08-22
            • 2019-07-29
            相关资源
            最近更新 更多