【问题标题】:Create a map of an object (not using underscore)创建对象的映射(不使用下划线)
【发布时间】:2017-03-26 06:15:48
【问题描述】:

我想做这个用户想做的几乎完全相同的事情:Underscore.js: create a map out of list of objects using a key found in the object

只有...

  • 我不想使用下划线库或 jQuery。只是普通的旧JS。
  • 我不希望我的对象键是字符串

所以如果我有这样的对象 -

var some_object_array = [{id: 1, val: 55}, {id: 2, val: 1}, {id: 3, val: 45}];

我想把它转换成 -

var some_map = {1: {id: 1, val: 55}, 2: {id: 2, val: 1}, 3: {id: 3, val: 45}};

另外,如果这是一个愚蠢的问题,我深表歉意。我是 JS 的新手,在过去的两个小时里我一直在试图解决这个问题并不断得到错误的结果。我设法返回了一个如下所示的对象:

{ '1': [ { id: 1, val: 55 } ],
  '2': [ { id: 2, val: 1 } ],
  '3': [ { id: 3, val: 45 } ] }

我的代码:

var some_object_array = [ {id: 1, val: 55},
                          {id: 2, val: 1},
                          {id: 3, val: 45}
                        ];


function groupBy(array, callback) {
  return array.reduce(function (result, item) {
    var key = callback(item);
    result[key] = item[key] || [];
    result[key].push(item);
    return result;
  }, {});
}


console.log(groupBy(some_object_array, function(i) { return i.id; }));

不太对。我的内部对象在数组中,我的键被转换为字符串。不足为奇,但我只是不知道如何修改我的代码。

【问题讨论】:

    标签: javascript object


    【解决方案1】:

    var objArr = [{id: 1, val: 55}, {id: 2, val: 1}, {id: 3, val: 45}];
    var some_map = {1: {id: 1, val: 55}, 2: {id: 2, val: 1}, 3: {id: 3, val: 45}};
    
    // Initialize empty object literal:
    let objMap = {};
    
    for (let i = 0; i < objArr.length; i++) {
      let key = objArr[i].id;
      objMap[key] = objArr[i];
    }
    
    console.log('Object Map:\n', objMap);
    /* Object Map:
    {
      "1": {
        "id": 1,
        "val": 55
      }, "2": {
        "id": 2,
        "val": 1
      }, "3": {
        "id": 3,
        "val": 45
      }
    }
    */

    【讨论】:

      【解决方案2】:

      你把事情复杂化了。

      您只需将项目分配给结果[key]。

      var some_object_array = [ 
        {id: 1, val: 55},
        {id: 2, val: 1},
        {id: 3, val: 45}
      ];
      
      
      function groupBy(array, callback) {
        return array.reduce(function (result, item) {
          var key = callback(item);
          result[key] = item;
          return result;
        }, {});
      }
      
      var r = groupBy(some_object_array, function(i) { return i.id; });
      console.log(r);
      //now lets get item with id 2
      console.log(r[2]);

      【讨论】:

      • 哦,伙计,我试过 result[key] = item[key],但这很有意义。但是,我的对象键 (1,2,3) 仍然显示为字符串。知道如何解决这个问题。这让我很困惑,因为我认为对象键总是字符串......所以......我如何“取消字符串化”一个键?
      • 我不确定你的意思。密钥始终采用这种形式。如果您查看 JSON,则必须始终使用双引号键。如果您使用整数查找,请不要担心它仍然可以工作。我会更新我的答案以显示这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多