首页 > 解决方案 > 在不使用索引作为键的情况下推送 JavaScript 对象

问题描述

我正在尝试遍历一组数据并创建一个 JavaScript 对象列表。数据包结构看起来像这样

let packet = {
location: "",
email: "" 
}

每个数据包的密钥应该是人名。所以最好是这样

let packet = {
 [name]:{
  location: "",
  email: "" 
 }
}

然后我遍历一组数据填充每个数据包并将其推入数据包列表

let packets = [];
for(index = 0; index < data.length; ++index){
 let packet = {
 [getnamefromdata(data[index])]:{
  location: getlocationfromdata(data[index]),
  email: getemailfromdata(data[index])
 }
}
packets.push(packet);
}

getname,location,emailfromdata 只是虚拟的伪函数。但是我在这里遇到的问题是,数据包结构看起来不像一个键列表,名称为每个键,而是一个整数索引列表,看起来像这样

0:{
 keyname:{
  location:
  email:
 }
}
1:{
 keyname:{
  location:
  email:
 }
}
2:{
 keyname:{
  location:
  email:
 }
}

但我真的不喜欢这种方式。是否可以摆脱每个索引并改用键名,因为每个键都是唯一的。所以我更喜欢这样

keyname:{
 location:
 email:
}
keyname:{
 location:
 email:
}
keyname:{
 location:
 email:
}

标签: javascript

解决方案


您可以只使用键/值对而不是数据包数组创建一个对象。

const packets = {};

for(index = 0; index < data.length; ++index){
  packets[getnamefromdata(data[index])] = {
    location: getlocationfromdata(data[index]),
    email: getemailfromdata(data[index])
  };
}

您也可以在没有 for 循环和使用reduce方法的情况下执行此操作。

const packets = data.reduce((prev, current) => ({
  ...prev,
  [getnamefromdata(current)]: {
    location: getlocationfromdata(current),
    email: getemailfromdata(current)
  }
}), {});

请参阅:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce


推荐阅读