【问题标题】:Convert Javascript array of objects into one object将 Javascript 对象数组转换为一个对象
【发布时间】:2018-04-19 07:54:27
【问题描述】:

假设我有一个这样的数组

var myarray=[{"id":1234, "listtext":open, "prop3":value3 ,"prop4": value4},
             {"id":1235, "listtext":open, "prop3":value3 ,"prop4": value4},
             {"id":1236, "listtext":open, "prop3":value3 ,"prop4": value4},
             {"id":1237, "listtext":open, "prop3":value3 ,"prop4": value4}];

但我想把它转换成这样的对象:

{1234:open,1235:close, 1236: pending,1237:awaiting response}

这可以吗?我尝试过的所有方法都只得到最后一个键值对。

【问题讨论】:

标签: javascript reactjs react-native


【解决方案1】:

如果你使用的是 ES6 或更高版本:

const converted = Object.assign({}, ...myArray.map(object => ({[object.id]: object})))

【讨论】:

  • 谢谢。我最初的解决方案实际上是有效的。我刚刚意识到我的源数据中的 id 是相同的,这就是为什么我只得到一个键值对。
  • 这是什么构造:...myArray(object?看起来您正在使用数组变量,就好像它是一个函数一样。是使用了点差还是可能缺少.map
  • 确实是展开操作符,这里用来访问数组中的项。免责声明:我自己没有想出这个 ;-) 在某处在线找到这个并将其添加到我的工具带中。我发现它是一个非常有用的 oneliner
  • 不,不是传播。这部分:myArray(object,执行它会给我“myArray 不是函数”
  • 啊,现在我看到了问题,你是对的,我确实缺少 map() 函数 ;-) 谢谢!有趣的是,这是如何在没有任何人之前注意到这个错误的情况下被接受的......
【解决方案2】:

您可以简单地遍历数组并创建一个新对象

var myarray=[{"id":1234, "listtext":'open', "prop3":'value3' ,"prop4": 'value4'},
             {"id":1235, "listtext":'open', "prop3":'value3' ,"prop4": 'value4'},
             {"id":1236, "listtext":'open', "prop3":'value3' ,"prop4": 'value4'},
             {"id":1237, "listtext":'open', "prop3":'value3' ,"prop4": 'value4'}];
const res = {};
myarray.forEach(obj => {
    res[obj.id] = obj.listtext;
})
console.log(res)

【讨论】:

  • 你犯了一个小错误:你在初始化空对象时使用了一个常量
  • 这并不是一个真正的错误,尽管如果不使用 ES6 可能会令人困惑。将属性分配给 const 对象就可以了。
  • @dentemm,由于我们没有重新分配 res,我们可以将其声明为 const obj
  • 啊,是的,我的错!
【解决方案3】:

var myarray = [
  { id: 1234, listtext: 'open' },
  { id: 1235, listtext: 'closed' },
  { id: 1236, listtext: 'pending' },
  { id: 1237, listtext: 'open' }
]

var output = myarray.reduce(function (acc, item) {
  acc[item.id] = item.listtext
  return acc
}, {})

console.log(output)

【讨论】:

  • 谢谢。我最初的解决方案实际上是有效的。我刚刚意识到我的源数据中的 id 是相同的,这就是为什么我只得到一个键值对。
【解决方案4】:

var myarray=[{"id":1234, "listtext":"open", "prop3":'value3' ,"prop4": 'value4'},
             {"id":1235, "listtext":"closed", "prop3":'value3' ,"prop4": 'value4'},
             {"id":1236, "listtext":"pending", "prop3":'value3' ,"prop4": 'value4'},
             {"id":1237, "listtext":"open", "prop3":'value3' ,"prop4": 'value4'}];

var myObjects = [];  // create an empty array to hold the converted objects.


// loop through the array to convert them one by one
myarray.forEach(function(element) {
  var obj = {};    // create an empty object
  obj[element.id] = element.listtext;
  myObjects.push(obj);  // add the object to the array
});


myObjects.forEach(function(object){
   console.log(object);
});

【讨论】:

  • 这对@ShubhamKhatri 的回答有何改进?
  • @Tibrogargan 当我发布我的答案时,我不知道其他人写了相同的确切答案
  • 谢谢。我最初的解决方案实际上是有效的。我刚刚意识到我的源数据中的 id 是相同的,这就是为什么我只得到一个键值对。
猜你喜欢
  • 2017-01-14
  • 1970-01-01
  • 2019-10-22
  • 2016-10-10
  • 2013-11-21
  • 2019-10-20
  • 2021-12-13
相关资源
最近更新 更多