【问题标题】:Javascript converting 2 string arrays to mapJavascript将2个字符串数组转换为映射
【发布时间】:2018-11-09 16:28:45
【问题描述】:

我有两个字符串数组键和值:

let keys = [a,b,c,d]
let values = [1,2,3,4]

如何将它们转换成地图?

预期输出为:

{a: "1", b: "2", c: "3", d: "4"}

【问题讨论】:

  • 针对 Java 提出的类似问题:stackoverflow.com/questions/12418334/…
  • @Pranay 你希望输出如何?
  • 你可以从写一些代码开始。
  • 您已经尝试过哪些代码?你的预期输出是什么?你想要一个实际的 JavaScript Map 还是一个普通的对象? (因为它们也有键/值)。
  • 预期输出为:{a: "1", b: "2", c: "3", d: "4"}

标签: javascript


【解决方案1】:

你可以在 ES6 中使用 Map

var myMap = new Map();

// setting the values
myMap.set('key1', 'value1');
myMap.set('key2', 'value2');
myMap.set('key3', 'value3');

你的答案:

for (let i = 0; i < keys.length; i++) {
     myMap.set(keys[i], values[i]); 
}

【讨论】:

  • 拜托,如果您不同意这个问题,那么投反对票有什么意义?
  • @LoredraL 这不是一个好的答案,也不是不同意这个问题。这是第一次尝试没有完成 - 它没有根据给定的输入生成所需的输出。
  • 感谢您的回答!
【解决方案2】:

首先创建一个对象。然后循环遍历你的数组并将键和值添加到对象中。

let keys = ['a','b','c','d'];
let values = [1,2,3,4];

let obj = {};

keys.forEach((key, index) => {
  obj[key] = values[index]
});

console.log(obj);

【讨论】:

  • IMO map 会比 forEach 更合适。
  • 你为什么这么认为? :-)
  • 其实我并没有……想了一会儿就改变了主意。
  • 感谢您的回答!
【解决方案3】:

您可以在任何数组上使用数组 reduce 并使用 index 从另一个数组中检索值

let keys = ['a', 'b', 'c', 'd'];
let values = [1, 2, 3, 4];
let k = keys.reduce((acc, curr, index) => {
  acc[curr] = values[index]
  return acc;
}, {});

console.log(k)

【讨论】:

    【解决方案4】:

    首先,你需要正确地声明你的字符串数组。

    let keys = ['a', 'b', 'c', 'd'];
    let values = ['1', '2', '3', '4'];
    
    var zip = (target, ...arr) => {
      if (target == null) throw Error('Target is undefined');
      if (arr[0] == null || arr[1] == null) throw Error('Lists must not be null');
      if (arr[0].length !== arr[1].length) throw Error('Lists must match in length');
      if (Array.isArray(target)) {
        arr[0].forEach((x, i) => target.push([arr[0][i], arr[1][i]]));
      } else if (typeof target === 'object') {
        arr[0].forEach((x, i) => target[arr[0][i]] = arr[1][i]);
      } else {
        throw Error('Unsupported target type');
      }
      return target;
    }
    
    var zipObj = (...arr) => zip.call(null, {}, ...arr);
    var zipArr = (...arr) => zip.call(null, [], ...arr);
    
    //console.log(zip({}, keys, values));
    console.log(zipObj(keys, values)); // Zip object
    
    //console.log(zip([], keys, values));
    console.log(zipArr(keys, values)); // Zip array
    .as-console-wrapper { top: 0; max-height: 100% !important; }

    【讨论】:

    • 感谢您的回答!
    【解决方案5】:

    当使用 lodash 时,这是一个单行:

    _.zipObject(keys,values)
    

    【讨论】:

      【解决方案6】:

      这应该可以解决问题:

      let keys = ['a','b','c','d']
      let values = [1,2,3,4]
      let mapped = keys.reduce((accumulator, current, index) => {
          accumulator[current] = values[index];
          return accumulator;
      }, {});
      
      console.log(mapped)
      // Result should be:
      {a: 1, b: 2, c: 3, d: 4}
      

      Reduce 是一种强大的方法,可用于各种任务。

      在这里,我们将keys 的给定值“减少”为一个对象,其中keys 是键,values 是相关值。

      reduce 中的第一个参数是一个回调函数,您至少需要传递accumulatorcurrent 变量(可以有不同的名称);其他参数是indexarray,分别代表迭代的当前索引和被迭代的原始数组。

      第二个参数是accumulator的初始值;默认情况下,它将是第一个 current 值,但在我们的示例中,我们将其设置为 {},因此我们可以将其视为一个对象。

      我希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-03
        • 2013-11-20
        • 1970-01-01
        • 2012-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多