【问题标题】:Array Key is not adding in node js数组键未在节点 js 中添加
【发布时间】:2019-10-14 19:58:28
【问题描述】:

你好,我是 node js 的新手。我想添加一个带有结果数组的键并将其打印在 json 数组中。

connection.modal.find( { 'id' : '2' }, function ( err, result ) {
    var response = {};

    result['add_key'] = 'abcdd';
    response['success'] = true;
    response['result'] = result;
    response['msg'] = 'Result fetched';
    res.json(response);
});

它在没有 add_key

的情况下打印

【问题讨论】:

  • result 声明在哪里?它是什么类型的变量?如果是数组,则在转成JSON时不枚举数组的属性。而且,您在 JSON 响应中究竟看到了什么?
  • 它是来自查询结果的结果数组。我更新了我的问题。
  • result的类型是Array,那么result['add_key'] = 'abcdd'对吗?
  • 我想你可以阅读这个链接:stackoverflow.com/questions/16196338/…

标签: arrays node.js mongodb mongoose


【解决方案1】:

JSON 数组数据类型不能在数组上有命名键。

普通的 JavaScript 数组被设计用来保存带有数字的数据 索引。您可以将命名键填充到它们上(这可能很有用 当您想存储有关保持正常的数组的元数据时, 有序的、数字索引的数据),但这不是它们的本质 专为

如果您想要命名键,请使用对象,而不是数组。

var test = {};           // Object
test['a'] = 'test';
test['b'] = [];          // Array
test['b'].push('item');
test['b'].push('item2');
test['b'].push('item3');
var json = JSON.stringify(test);
alert(json);

【讨论】:

  • 它是来自查询结果的结果数组。我更新了我的问题。
【解决方案2】:

虽然 Javascript 数组可以具有自定义属性,例如您正在使用这行代码:

result['add_key'] = 'abcdd';

JSON.stringify()(因此也包括res.json())只会将实际的数组元素(不是自定义属性)放入生成的 JSON 中。所以,如果result 是一个数组,这就是为什么这个属性不会显示在生成的 JSON 中。

其实JSON文本格式,只有一个数组元素的位置,在JSON格式的数组中。没有像您的 ['add_key] 属性这样的常规自定义属性的位置。该属性必须位于普通对象上才能在 JSON 中显示。

在描述数组的section 7 of the JSON specification 中, 它清楚地表明,数组的唯一 JSON 表示是 数组元素本身(用逗号分隔)。数组表达式中没有属性名称/值对的位置。


您没有准确显示您希望生成的 JSON 的样子,但还有其他几种方法可以表示 add_key 属性和值。您可以将属性移动到 response 对象:

connection.modal.find( { 'id' : '2' }, function ( err, result ) {
    var response = {};

    response['add_key'] = 'abcdd';
    response['success'] = true;
    response['result'] = result;
    response['msg'] = 'Result fetched';
    res.json(response);
});

您可以将结果放入它自己的对象中,并且该对象可以具有add_key 属性:

connection.modal.find( { 'id' : '2' }, function ( err, result ) {
    var response = {};
    var resultContainer = {};

    resultContainer['add_key'] = 'abcdd';
    resultContainer['result'] = result;
    response['success'] = true;
    response['result'] = resultContainer;
    response['msg'] = 'Result fetched';
    res.json(response);
});

仅供参考,您通常不必使用括号语法来设置属性。你也可以这样做(很多人觉得更干净一些):

connection.modal.find( { 'id' : '2' }, function ( err, result ) {
    var response = {};

    response.add_key = 'abcdd';
    response.success = true;
    response.result = result;
    response.msg = 'Result fetched';
    res.json(response);
});

您必须使用方括号语法的唯一情况是属性名称在字符串变量中,或者它包含点语法中不允许的某些字符。对于常规字母字符和不在变量中的属性名称,您可以使用点语法。

【讨论】:

    【解决方案3】:

    Nodejs 没有命名索引数组(关联数组)

    对于相同的 Nodejs 有 Object 数据类型使用它

    根据你的情况

    
    connection.modal.find( { 'id' : '2' }, function ( err, result ) {
        var response = {};
    
        // Converting array to object
        result = Object.assign({}, result);
        // Now you can add your required keys
        result['add_key'] = 'abcdd';
    
        response['success'] = true;
        response['result'] = result;
        response['msg'] = 'Result fetched';
        // Now response will have numeric keys and your required key also 
        // but data type will object
        res.json(response);
    });
    

    我希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 2019-01-21
      • 2022-01-15
      • 2019-12-10
      相关资源
      最近更新 更多