根据具有自定义键值的对象数组创建对象

时间:2018-07-04 05:01:25

标签: javascript arrays object

现在我知道有一些类似this questionthis question的问题,但都没有回答我的问题。

好吧...

说我有一个api调用,我得到了这样的响应

[
  {
     amount: 23,
     bill: 47,
     otherData: null,
     title: 'cool title'
  },
  {
     amount: 223,
     bill: 427,
     otherData: null,
     title: 'cooler title'
  },
  {
     amount: 2313,
     bill: 437,
     otherData: null,
     title: 'super cool title'
  },
  {
     amount: 123,
     bill: 147,
     otherData: null,
     title: 'coolest title'
  }
]

有没有一种方法可以从此数组创建一个新对象,并可以使用该对象中的属性创建自定义键名?所以所需的输出是..

{
  coolTitle: {
     amount: 23,
     bill: 47,
     otherData: null,
     title: 'cool title'
  },
  coolerTitle: {
     amount: 223,
     bill: 427,
     otherData: null,
     title: 'cooler title'
  },
  superCoolTitle: {
     amount: 2313,
     bill: 437,
     otherData: null,
     title: 'super cool title'
  },
  coolestTitle: {
     amount: 123,
     bill: 147,
     otherData: null,
     title: 'coolest title'
  }
}

现在我知道我可以将对象数组转换成这样的对象。

var result = {};
for (var i=0; i<array.length; i++) {
  result[array[i].key] = array[i].value;
}

但是我不知道如何从每个对象中获取标题,驼峰式命名,然后创建自定义键和对象

我什至不确定是否可以进行类似的操作

谢谢

2 个答案:

答案 0 :(得分:1)

要获取属性名称,请提取title并将其空格字符替换为大写字符。然后,就像reduce插入对象一样简单:

const input=[{amount:23,bill:47,otherData:null,title:'cool title'},{amount:223,bill:427,otherData:null,title:'cooler title'},{amount:2313,bill:437,otherData:null,title:'super cool title'},{amount:123,bill:147,otherData:null,title:'coolest title'}]

console.log(
  input.reduce((a, item) => {
    const { title } = item;
    const camel = title.replace(/ ./g, chars => chars[1].toUpperCase());
    a[camel] = item;
    return a;
  }, {})
);

答案 1 :(得分:0)

使用mapreduce,reduce方法将返回带有自定义键的新对象。在reduce方法内部使用map。这将创建一个title值的数组,例如['cool','title']。在相同的map方法内,创建一个字符串以 将单词的第一个字符转换为upperCase,然后将join转换为所有单词

let oldArr = [{
    amount: 23,
    bill: 47,
    otherData: null,
    title: 'cool title'
  },
  {
    amount: 223,
    bill: 427,
    otherData: null,
    title: 'cooler title'
  },
  {
    amount: 2313,
    bill: 437,
    otherData: null,
    title: 'super cool title'
  },
  {
    amount: 123,
    bill: 147,
    otherData: null,
    title: 'coolest title'
  }
]



let newArray = oldArr.reduce(function(acc, curr) {
  let crtTitle = curr.title.split(' ').map(function(item, index) {
    if (index !== 0) {
      return item.substring(0, 1).toUpperCase() + item.substring(1, item.length);
    } else {
      return item;
    }

  }).join('');
  acc[crtTitle] = curr;
  return acc
}, {});
console.log(newArray)