【问题标题】:how to create key value pair from an a array如何从数组创建键值对
【发布时间】:2017-07-21 21:39:47
【问题描述】:

这是我的 json:

[["123", "456", "789", "user1"],
 ["987", "654", "321", "user2"]]

我在我的代码中是这样写的:

var rows = [ 
  ["123","456","789","user1"] ,
  ["987","654","321","user2"]
];

我希望 user1 和 user2 作为键,其余作为值。如何从此json创建键值对?

【问题讨论】:

  • 我在 jsonlint 中检查了它,它显示了有效的 json@sᴜʀᴇsʜᴀᴛᴛᴀ
  • 对不起,我的错。 ..
  • 我试过这个:for(i=0,i

标签: javascript jquery hashmap hashtable


【解决方案1】:

您可以简单地使用Array.prototype.forEach() 进行迭代并将弹出的项目推入一个数组。

var arr = {};
var rows = [ 
["123","456","789","user1"] ,
["987","654","321","user2"],
  ["12213","45216","78219","user1"],
  ["abc","def","ghi","user1"],
  ["uvw","wxy","xyz","user2"]
 ];
rows.forEach(function(item){  
  var val = item[item.length-1];
  if ( arr[val] ) {   
   arr[item.pop()].push(item);
  } else {
    arr[item.pop()] = [item];
  }
});
console.log(JSON.stringify(arr));

如果您希望将所有值分组并映射到键:

var arr = {};
var rows = [ 
["123","456","789","user1"] ,
["987","654","321","user2"],
  ["12213","45216","78219","user1"],
  ["abc","123","ghi","user1"],
  ["678","789","890","user2"]
 ];
rows.forEach(function(item){  
  var val = item[item.length-1];
  if ( arr[val] ) {
    arr[item.pop()] = arr[val].concat(item);
  } else {
    arr[item.pop()] = item;
  }
});
console.log(JSON.stringify(arr));

【讨论】:

    【解决方案2】:

    使用Array#reduce方法生成对象。

    var data = [
      ["123", "456", "789", "user1"],
      ["987", "654", "321", "user2"]
    ];
    
    var res = data
      // iterate over the array elements
      .reduce(function(obj, arr) {
        // define the object property by popping the last element
        // if you dont want to update the origian array 
        // element then take copy of inner array using slice()
        obj[arr.pop()] = arr;
        // return the object reference
        return obj;
        // set initial value as an empty object
      }, {})
    
    console.log(res);

    如果您不想更新原始数组:

    var data = [
      ["123", "456", "789", "user1"],
      ["987", "654", "321", "user2"]
    ];
    
    var res = data.reduce(function(obj, arr) {
      obj[arr[arr.length - 1]] = arr.slice(0, -1);
      return obj;
    }, {})
    
    console.log(res);

    更新:如果有机会为同一用户提供多个元素,那么您可以将它们组合起来。

    var data = [
      ["123", "456", "789", "user1"],
      ["987", "654", "321", "user2"],
      ["abc", "def", "ghi", "user1"]
    ];
    
    var res = data.reduce(function(obj, arr) {
      // initialize propety as an empty array if undefined
      obj[arr[arr.length - 1]] = obj[arr[arr.length - 1]] || [];
      // push the array values into the array
      [].push.apply(obj[arr[arr.length - 1]], arr.slice(0, -1));
      return obj;
    }, {})
    
    console.log(res);

    【讨论】:

    • 如果 data = [ [ "user1","123", "456", "789"], ["987", "654", "321", "user2 "] ];
    • 这段代码其实很有用。但是如果我为 user1 再输入 1 个数组,它只会显示我输入的新数组。即 if ["123", "456", "789", "user1"], ["abc", "def", " ghi", "user1"], ["987", "654", "321", "user2"] 它显示 user1: abc , def , ghi 而不是之前的 @PranavCBalan
    • @Mary : 你想将它们结合起来的预期行为是什么
    • 如果我为 user1 添加更多数组,我应该得到一个单键 user1 及其所有值。即: user1:["123", "456", "789"] ["abc", "def", "ghi"] 然后 user2 , user3 etc @PranavCBalan
    猜你喜欢
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2019-01-01
    • 2016-12-31
    • 2015-03-22
    • 1970-01-01
    相关资源
    最近更新 更多