【问题标题】:Shrink this array of RowDataPacket objects into a single object将此 RowDataPacket 对象数组收缩为单个对象
【发布时间】:2016-12-15 08:06:22
【问题描述】:

我正在使用 node.js

我在下面有这个 RowDataPacket 对象数组;

{
    _ID: 4,
    _NAME: "Switch4",
    _CASE_COUNTER: 1,
    _CASE_ID: 1
},
{
    _ID: 4,
    _NAME: "Switch4",
    _CASE_COUNTER: 2,
    _CASE_ID: 2
}
{
    _ID: 4,
    _NAME: "Switch4",
    _CASE_COUNTER: 3,
    _CASE_ID: 3
}

我想将这个 RowDataPacket 对象数组缩小为一个对象。缩小后是这个样子的;

{
    _ID: 4,
    _NAME: "Switch4",
    _CASE_COUNTER: 1,
    _CASE_ID: 1,
    _CASE_COUNTER: 2,
    _CASE_ID: 2,
    _CASE_COUNTER: 3,
    _CASE_ID: 3 
}

_ID_NAME 在 RowDataPacket 对象数组中具有相同的值。其他键将具有不同的值。如何在 node.js v4.7.x 中做到这一点?

编辑:它不是原始问题中提到的 json 对象数组。它是一个 RowDataPacket 对象数组,是 MySQL 查询的结果。

【问题讨论】:

  • 好吧,你必须重命名一些键,因为你不能有重复。
  • keys 应该是唯一的,否则最后遇到的 key 的值只会是增益
  • 感谢指正。我已经编辑了这个问题。它是一个 RowDataPacket 对象数组,而不是 json 对象数组。我的错。
  • 您可以使用Array.reduce 方法来实现此目的,但最终对象中不应有重复的属性(在您的情况下为_CASE_ID,_CASE_COUNTER)。您需要覆盖它们的值或为每个重复的属性创建数组。
  • 键在对象中必须是唯一的。你能相应地更新问题吗?

标签: arrays node.js


【解决方案1】:

你不能在一个对象中使用相同的索引,但你可以通过不同的方式来实现它收缩的数据格式应该如下所述

{
  4:{   //here 4 is _ID
    _NAME:"Switch4",
    _CASE_COUNTER:[1,2,3], // array of all _CASE_COUTER for same _ID
    _CASE_ID:[1,2,3]     // array of all _CASE_IDfor same _ID
  }
}

假设你的数据结构是

var data=[{
    _ID: 4,
    _NAME: "Switch4",
    _CASE_COUNTER: 1,
    _CASE_ID: 1
},
{
    _ID: 4,
    _NAME: "Switch4",
    _CASE_COUNTER: 2,
    _CASE_ID: 2
},
{
    _ID: 4,
    _NAME: "Switch4",
    _CASE_COUNTER: 3,
    _CASE_ID: 3
}];

您可以通过以下方式收缩数据

shrink_data={};
for(i=0 ; i < data.length; i++){
  if(typeof shrink_data[data[i]._ID] == "undefined")
  {
    shrink_data[data[i]._ID]={
      _NAME: data[i]._NAME, 
      _CASE_COUNTER: [data[i]._CASE_COUNTER],
      _CASE_ID: [data[i]._CASE_ID] 
    };
  }
  else
  {
    shrink_data[data[i]._ID]._CASE_COUNTER.push(data[i]._CASE_COUNTER);
    shrink_data[data[i]._ID]._CASE_ID.push(data[i]._CASE_ID);
  }
}
console.log(JSON.stringify(shrink_data)); 
// {"4":{_NAME:"Switch4",_CASE_COUNTER:[1,2,3],_CASE_ID:[1,2,3]}}

【讨论】:

    【解决方案2】:

    对象不能有多个相同的键。
    我建议您将这些数据收集到数组中:

        function combine(list) {
          return list.reduce((carry, o) => {
            for (var k in o) {
              if (!carry[k]) carry[k] = [];
              carry[k].push(o[k]);
            }
            return carry;
          }, {});
        }
        var input = [];
        input.push({id: 1, tag: 'Tag#1'});
        input.push({id: 2, tag: 'Tag#2'});
        input.push({id: 3, tag: 'Tag#3'});
        var res = combine(input);
        console.log(res);

    对于不同键的不同行为,我们应该提供一些模式:

    function combine(list, schema) {
          return list.reduce((carry, o) => {
            for (var k in o) {
              switch (schema[k]) {
                case 'scalar': carry[k] = o[k]; break;// Overwrite
                default:
                case 'array': 
                  if (!carry[k]) carry[k] = [];
                  carry[k].push(o[k]);
                  break;
              }
            }
            return carry;
          }, {});
        }
        var input = [];
        input.push({id: 1, tag: 'Tag#1'});
        input.push({id: 1, tag: 'Tag#2'});
        input.push({id: 1, tag: 'Tag#3'});
        var res = combine(input, {id: 'scalar', tag: 'array'});
        console.log(res);

    【讨论】:

      猜你喜欢
      • 2016-09-23
      • 2021-09-16
      • 2018-07-10
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 2022-11-08
      • 1970-01-01
      相关资源
      最近更新 更多