如何在reduce函数中动态设置键

时间:2016-02-15 16:39:11

标签: javascript

我有一个包含所有拼字游戏字母数量的.txt文件:

A-9, B-2, C-2, D-4, E-12, F-2, G-3, H-2, I-9, J-1, K-1, L-4, M-2, N-6, O-8, P-2, Q-1, R-6, S-4, T-6, U-4, V-2, W-2, X-1, Y-2, Z-1

我试图从中获取一个对象数组,其中键是字母,值是数字。

我遇到的问题是我试图将密钥设置为数组中的第一项(我之前拆分)[A, 9]

我的代码如下。感谢任何提示:)

import fs from 'fs'

var output = fs.readFileSync('scrabble-quantities.txt', 'utf-8')
    .trim()
    .split(', ')
    .map(item => item.split('-'))
    .reduce((quantities, item) => {
        quantities.push({
            item[0]: item[1]
        })
        return quantities
    }, [])    

由于

2 个答案:

答案 0 :(得分:6)

我会使用对象而不是数组。 JS的工作方式更简单,更自然:

// ...
.reduce((quantities, item) => {
    quantities[item[0]] = item[1];
    return quantities;
}, {});

然后生成output对象(以JSON表示法):

{
  "A": 9,
  "B": 2,
  // ...
  "Z": 1
}

编辑:注意值类型

如果您希望该值为实际数字,则必须在赋值中使用以下内容对其进行解析:

parseInt(item[1], 10)

答案 1 :(得分:4)

要动态创建密钥(属性名称),您需要执行以下两项操作之一:

  1. 在ES5及更早版本中,您必须创建对象,然后设置属性:

      var o = {};
      o[item[0]] = item[1];
    
  2. 在ES2015(又名ES6)及更高版本中,您可以通过[]在属性初始值设定项中使用动态属性名称

      // ES2015 (ES6) ONLY
      quantities.push({
          [item[0]]: item[1]
      })
    
  3. 那就是说,我会以不同的方式解决问题,使用正则表达式并最终得到一个由字母键入的对象而不是一个对象数组:

    var str = "A-9, B-2, C-2, D-4, E-12, F-2, G-3, H-2, I-9, J-1, K-1, L-4, M-2, N-6, O-8, P-2, Q-1, R-6, S-4, T-6, U-4, V-2, W-2, X-1, Y-2, Z-1";
    var quantities = {};
    str.match(/[A-Z]-\d/g).forEach(function(entry) {
      quantities[entry.charAt(0)] = +entry.replace(/.-/, '');
    });
    snippet.log(quantities);
    <!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
    <script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

    然后,查找字母数量变为quantities.A(如果quantities[letter]是包含letter的变量,则为"A"):

    console.log(quantities.A); // 9