【问题标题】:Pull key from Array of Objects Dynamically And Transform to Array of Objects从对象数组中动态拉取键并转换为对象数组
【发布时间】:2018-03-19 13:34:39
【问题描述】:

我有一个具体的案例,不知道能不能实现。

给定输入数组。

var originalArr = [
  [
    { ID: 3, name: 'Beef' },
    { ID: 4, name: 'Macaroni' },
    { ID: 5, name: 'Sauce#1' }
  ],
  [{ ID: 1, name: 'Lettuce' }, { ID: 2, name: 'Brocoli' }]
];

我想遍历内部数组并从对象中选择 ID,然后创建一个新的来代替数组。所以我的输出应该是这样的。

var output = [
  {
    '1': {
      name: 'Lettuce',
      ID: 1
    },
    '2': {
      name: 'Brocoli',
      ID: 2
    }
  },
  {
    '3': {
      name: 'Beef',
      ID: 3
    },
    '4': {
      name: 'Macaroni',
      ID: 4
    },
    '5': {
      name: 'Sauce#1'
    }
  }
];

使用map 迭代内部数组很容易,但是如何创建新的Object 来代替数组并动态拉起其键值?甚至有可能给定我的输入来产生所需的输出。

【问题讨论】:

  • 一个问题:在您的输出中,ID 值为“1”和“2”的对象排在第一位,但在输入数组中它排在第二位。除了重新排列之外,您还想做一些排序吗?
  • 不需要整理东西。

标签: javascript arrays object


【解决方案1】:

使用mapreduce

originalArr.map( s => //iterate outer array
    s.reduce( (acc, c) => (  //iterate inner array using reduce
       acc[c.ID] = c, acc  //assign the id as key to accumulator and return the accumulator
    ) , {}) //initialize accumulator to {}
)

演示

var originalArr = [
  [
    { ID: 3, name: 'Beef' },
    { ID: 4, name: 'Macaroni' },
    { ID: 5, name: 'Sauce#1' }
  ],
  [{ ID: 1, name: 'Lettuce' }, { ID: 2, name: 'Brocoli' }]
];

var output = originalArr.map( s => s.reduce( (acc, c) => ( acc[c.ID] = c, acc ) , {}) );

console.log(output);

【讨论】:

    【解决方案2】:

    你可以用纯javascript实现递归

    var originalArr = [
            [{
                ID: 3,
                name: 'Beef'
            }, {
                ID: 4,
                name: 'Macaroni'
            }, {
                ID: 5,
                name: 'Sauce#1'
            }],
            [{
                ID: 1,
                name: 'Lettuce'
            }, {
                ID: 2,
                name: 'Brocoli'
            }]
        ]
    
        function bindInObject(object, array) {
            for (var i = 0; i < array.length; i++) {
                var it = array[i];
                if (it instanceof Array) {
                    bindInObject(object, it);
                } else {
                    var id = it.ID;
                    object[id] = it;
                }
            }
        }
        var output = {};
    
        bindInObject(output, originalArr);
        console.log(output) 
    

    【讨论】:

      【解决方案3】:
      const original_array = [
      [
          { ID: 3, name: 'Beef' },
          { ID: 4, name: 'Macaroni' },
          { ID: 5, name: 'Sauce#1' }
      ],
      [
          { ID: 1, name: 'Lettuce' },
          { ID: 2, name: 'Brocoli' }
      ]
      ]
      
      let new_array = []
      
      for (let i=0; i < original_array.length; i++) {
          if (original_array[i + 1]) new_array = 
          new_array.concat(original_array[i].concat(original_array[i+1]))
      }
      
      let output = []
      
      for (let i=0; i<new_array.length; i++) {
          output.push({[new_array[i].ID]: new_array[i]})
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-29
        • 2019-06-22
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 2021-02-14
        • 2021-03-10
        • 1970-01-01
        相关资源
        最近更新 更多