将数组转换为特定对象

时间:2018-02-17 00:58:02

标签: javascript arrays json javascript-objects

给出以下JSON

{
gif: ['small', 'medium', 'large'],
jpeg: ['tiny', 'huge']
}

我想将数组中的每个元素转换为子对象中的键,并将其分配给数量为1。

就这样

{
gif: {
  small: {quantity: 1},
  medium: {quantity: 1},
  large: {quantity:1}
  },
jpeg: {
  tiny: {quantity:1},
  huge: {quantity: 1}
  }
}

我最接近的是以下

for(let image in obj) { 
  obj[image].forEach(size => { obj[image][size] = { quantity:1}})
}

然而不幸的是,这就是

{ gif: 
  [ 'small',
    'medium',
    'large',
     small: {quantity: 1},
     medium: {quantity: 1},
     large: {quantity: 1} ],
 jpeg: [ 'huge', 'tiny', tiny: {quantity:1} huge: {quantity: 1 } ] 
} 

任何帮助都会很棒,谢谢

4 个答案:

答案 0 :(得分:4)

您可以使用reduce循环中的forEach进行就地转换:



const o = {
  gif: ['small', 'medium', 'large'],
  jpeg: ['tiny', 'huge']
}

Object.keys(o)
  .forEach(
    k => o[k] = o[k].reduce(
      (a, e) => (a[e] = {
        quantity: 1
      }) && a, {}
    )
  )

console.log(o)




使用双reduce转换为新对象:



const o = {
  gif: ['small', 'medium', 'large'],
  jpeg: ['tiny', 'huge']
}

var o2 = Object.keys(o).reduce((n, k) => (n[k] = o[k].reduce((a, e) => (a[e] = {quantity:1}) && a, {})) && n, {})

console.log(o2)




答案 1 :(得分:1)

您可以使用SELECT variable_name, default_value FROM information_schema.system_variables ORDER BY variable_name 方法

.reduce()

答案 2 :(得分:0)

您可以在reduce上使用Object.keys方法,在里面可以使用mapObject.assign来返回新对象。

const data = {
  gif: ['small', 'medium', 'large'],
  jpeg: ['tiny', 'huge']
}

const result = Object.keys(data).reduce(function(r, e) {
  r[e] = Object.assign({}, ...data[e].map(k => ({[k]: {quantity: 1}})))
  return r;
}, {})
console.log(result)

答案 3 :(得分:0)

const obj = {
  gif: ['small', 'medium', 'large'],
  jpeg: ['tiny', 'huge']
}

const objKeys = Object.keys(obj);

for(let i=0;i<objKeys.length;i++){
  const currentKey = objKeys[i];
  obj[currentKey] = obj[currentKey].reduce((sum, element) => { 
    sum[element] = {quantity: 1};
    return sum;
  }, {});
}

这是一个解决方案,您将遍历数组并将其替换为对象