【问题标题】:Convert two arrays into an object将两个数组转换为一个对象
【发布时间】:2018-08-27 23:46:31
【问题描述】:
var foo = { "a": [1,2,3] }
var bar = { "b": [7,8,9] }

输出应该是这样的

[ {a: 1, b: 7}, {a: 2, b: 8}, {a:3, b: 9}]

如何使用 ramda 或 javascript 函数式编程来做到这一点?

我已经使用 for loop i = 0 完成了这个,是否可以使用函数式 ramda 编程

【问题讨论】:

    标签: javascript arrays object functional-programming ramda.js


    【解决方案1】:

    如果两个数组的长度始终相同,您可以使用map 来做到这一点。

    function mergeArrays(arr1, arr2) {
      return arr1.map(function(item, index) {
        return {
          a: arr1[index], //or simply, item
          b: arr2[index]
        };
      });
    }
    
    var a = [1, 2, 3];
    var b = [7, 8, 9];
    
    var joined = mergeArrays(a, b);
    
    document.getElementById('result').innerHTML = JSON.stringify(joined, null, 2);
    <pre id="result">
      
    </pre>

    【讨论】:

      【解决方案2】:

      我有一个数组

      const peopleObject = { "123": { id: 123, name: "dave", age: 23 },
      “456”:{ id:456,姓名:“chris”,年龄:23​​ },“789”:{ id:789,姓名: “鲍勃”,年龄:23​​ },“101”:{ id:101,名称:“汤姆”,年龄:23​​ },“102”: { id: 102, name: "tim", age: 23 } }

      为此,我创建了一个将数组转换为对象的代码,希望这对您有用

      const arrayToObject = (array) =>
         array.reduce((obj, item) => {
           obj[item.id] = item
           return obj
         }, {})
      const peopleObject = arrayToObject(peopleArray)
      console.log(peopleObject[idToSelect])
      

      【讨论】:

        【解决方案3】:

        您的预期输出格式无效。您应该将数据存储在数组中。喜欢,

        var output = [];
        var a = [1,2,3], b = [7,8,9];
        for(var i=0; i< a.length; i++){
          var temp = {};
          temp['a'] = a[i];
          temp['b'] = b[i];
          output.push(temp);
        }
        

        您不能以您想要的方式将结果存储在对象中。对象是键值对。但是您期望的只是没有键的值,这是不可能的!

        【讨论】:

          【解决方案4】:

          假设你想要[{a:1,b:7},{a:2,b:8},{a:3,b:9}],它可以很容易地使用 map 使用索引来获取 b 中的值:

          var result = a.map((v, i) =>({ a: v, b: b[i] }));
          

          【讨论】:

            【解决方案5】:

            您可以使用R.transpose[[1,2,3], [7,8,9]] 的数组转换为[[1, 7], [2, 8], [3, 9]],然后使用R.zipObj 映射它。

            const fn = R.compose(
              R.map(R.zipObj(["a", "b"])),
              R.transpose
            )
            
            const a = [1, 2, 3], b = [7, 8, 9]
            
            const result = fn([a, b])
            
            console.log(result)
            &lt;script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"&gt;&lt;/script&gt;

            如果您希望将ab 作为两个参数传递给fn 而不是数组,那么您可以将上面示例中的R.transposeR.unapply(R.transpose) 交换。

            【讨论】:

              【解决方案6】:

              从 ramda 的 addIndexmap 中创建函数

              const data = { keys: ['a', 'b', 'c'], values: ['11', '22', '33'] }
              
              const mapIndexed = R.addIndex(R.map)
              
              const result = mapIndexed((item, i) => {
                return { [item]: data.values[i] }
              }, data.keys)
              

              你会得到一个对象数组

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-12-13
                • 1970-01-01
                • 1970-01-01
                • 2013-07-04
                相关资源
                最近更新 更多