【问题标题】:Replace null values to empty values in a JSON OBJECT将空值替换为 JSON OBJECT 中的空值
【发布时间】:2014-03-05 16:27:55
【问题描述】:

您好,我有一个 ajax 请求提供的 JSON 对象。

json 中的某些值显示为 null,但我想要一个 empty String 代替

我的代码示例:

$.post("/profil_process/wall/preview-post.php",param, function (data){
    // this does not work
    JSON.stringify(data, function(key, value) { return value === "" ? "" : value });
    $('#previewWall').html(getPostWall(data.type,data.titre,data.url,data.description,data.media,data.photo_auteur,data.nom_auteur,data.url_auteur,data.date_publication)).fadeIn();
    $(".bouton-vertM").show();
    $("#wLoader").hide();
},'json');

有什么想法吗?

【问题讨论】:

  • 您的代码说如果该值为空字符串,则应返回空字符串;如果是其他任何内容,则应按原样返回该值。因此,它完全等同于 return value;
  • 不应该和null比较吗?
  • 你意识到data 并没有真正改变,即使你像这样对对象进行字符串化?
  • @Kuma:你从哪里得到的代码?它不会出现在修订历史记录中。
  • @BoltClock,我相信在我应用我的编辑之前,它是由他首先编辑的(以缩小代码范围)。在此处查看一个包含相同代码的答案。

标签: javascript jquery json


【解决方案1】:

你的函数应该是这样的:

function (key, value) {
    return (value === null) ? "" : value;
}

如果value 为空,则返回一个空字符串。

【讨论】:

  • value == null 在值为nullundefined 时为真,因此无需进一步比较。
  • 我的 data.description 应用后仍然为空 : JSON.stringify(data, function (key, value) {return (value == null) ? "" : value});
  • @Anthony - 正如我对答案的评论,这不会改变任何东西,字符串是不可变的,并且对象肯定不会因为您决定字符串化而更新它。
  • 正确,正如@adeneo 所说,该函数仅在将 json 呈现为字符串时起作用,但它不会更改原始 JSON 中任何字段的值。为此,您应该处理原始 JSON 变量并更改值...
  • 这可以重构为return value || "";
【解决方案2】:

如果您可以在序列化字符串上用空字符串替换 null-s,请执行以下操作:

data = JSON.parse(JSON.stringify(data).replace(/\:null/gi, "\:\"\"")); 

【讨论】:

  • 你不认为使用内置的替换器参数而不是字符串替换会更好吗?
  • 在我们使用序列化 JSON 字符串并且不会影响性能的情况下,我看不出这是一个坏主意的原因
  • 但是 JSON.stringify 有一个内置的替换器作为第二个参数,这是 OP 正在使用的。您不认为使用内置的替换器参数比无缘无故地创建自己的替换器参数更好吗?
  • 是的,你是对的。我认为这是干净的在线解决方案,但我绝对同意您的观点,即内置解决方案应始终优先于自定义解决方案。
  • 这是一个可怕的想法。
【解决方案3】:

你应该这样做,用空字符串替换对象值,而不是字符串化它

$.post("/profil_process/wall/preview-post.php",param, function (data){

    (function removeNull(o) {
        for(var key in o) {
            if( null === o[key] ) o[key] = '';
            if ( typeof o[key] === 'object' ) removeNull(o[key]);
        }
     })(data);

     $('#previewWall').html(
          getPostWall(
              data.type,
              data.titre,data.url,
              data.description,
              data.media,
              data.photo_auteur,
              data.nom_auteur,
              data.url_auteur,
              data.date_publication
          )  // ^^^ why not just pass the entire object ?
    ).fadeIn();

    $(".bouton-vertM").show();
    $("#wLoader").hide();

},'json');

【讨论】:

    【解决方案4】:

    对于仍在寻找解决方案的任何人。

    在我的 Angular 2 应用程序中使用它来删除我的数据库查询返回的所有空值。

    在组件中创建一个angular 2函数

        replacer(i, val) {
         if ( val === null ) 
         { 
            return ""; // change null to empty string
         } else {
            return val; // return unchanged
         }
        }
    

    或Javascript函数

        function replacer(i, val) {
         if ( val === null ) 
         { 
            return ""; // change null to empty string
         } else {
            return val; // return unchanged
         }
        }
    

    然后使用 JSON.stringify 方法中的函数

        JSON.stringify(result, this.replacer)
    

    【讨论】:

      【解决方案5】:

      这是一个简单的代码,它将所有null 值转换为一个空的string

      let myObject = {
        "id":1,
        "name": "Ali",
        "address":null,
        "phone":null,
        "age":22
      }
      Object.keys(myObject).map(function (key, index) {
                      if (myObject[key] == null) {
                          myObject[key] = "";
                      }
                  });
      console.log(myObject); 
      
      // output
      /* {
        "id": 1,
        "name": "Ali",
        "address": "",
        "phone": "",
        "age": 22
      }  */

      【讨论】:

        【解决方案6】:

        我建议你检查 Ajax 的返回类型,因为它决定了如何删除 null

        如果是字符串,可以这样使用:

        data = data.replace(/null/g, '""');  //Stays as string
        

        或者:

        data = JSON.parse(data);    // Turns to a JSON object
        

        如果是json对象,那么你可以使用这个:

        data = JSON.stringify(data).replace(/null/g, '""');  //Turns to string
        

        【讨论】:

          【解决方案7】:

          下划线 mapObject 给了我最紧凑的解决方案。这是一个完整的例子:

          $ npm install underscore
          
          import _, { map, each } from 'underscore';
          var x = {a:null, b:1, c:'c', d:null}
          var y = _.mapObject(x, function(val, key) {
                      return val || '';
                  });
          console.log('No nulls:', y)
          
          No nulls: {a:"", b:1, c:"c", d:""}
          

          【讨论】:

            【解决方案8】:

            希望对你有所帮助

            var List = [];
            
            
            $.post("/profil_process/wall/preview-post.php",param, function (data){
            
            jQuery.each(data, function (key, value) {
                            List.push({
                                ReportId : value.ReportId,
                                ReportType: CheckNullReturnBlank(value.ReportType),
                                ReportName: CheckNullReturnBlank(value.ReportName),
                                Description : CheckNullReturnBlank(value.Description)
                            })
                        });   },'json');
            
            
            
            function CheckNullReturnBlank(item) {
                return item = (item == null) ? '' : item;
            }
            

            【讨论】:

              【解决方案9】:

              您可以通过以下 java-script 中的代码将 null 值替换为空

              var remove_empty = function ( target ) {
                Object.keys( target ).map( function ( key ) {
                  if ( target[ key ] instanceof Object ) {
                    if ( ! Object.keys( target[ key ] ).length && typeof target[ key ].getMonth !== 'function') {
                      target[ key ] = "";
                    }
                    else {
                      remove_empty( target[ key ] );
                    }
                  }
                  else if ( target[ key ] === null ) {
                     target[ key ] = "";
                  }
                } );
                return target;
              };
              

              你可以阅读更多关于Object.keys的信息

              【讨论】:

                【解决方案10】:
                function returnblank(item){
                  if(item == null){
                    return "";
                  }else{
                    return item;
                  }
                }
                

                【讨论】:

                • 稍微解释一下也无妨。
                • 请尝试为您的答案添加解释。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-08-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-10-21
                • 2018-05-14
                相关资源
                最近更新 更多