Javascript 从API数据创建对象并将其动态添加到数组
我有一个从数据库中提取的数据集。它是一维的,我基本上需要使它更结构化。我称之为“平坦” 我需要显示一个标题,以及该标题下与标题相关的项目 数据以具有和节名(标题)和项目名(项目)以及每个项目特有的其他数据(如下载URL等)的形式出现Javascript 从API数据创建对象并将其动态添加到数组,javascript,arrays,reactjs,foreach,javascript-objects,Javascript,Arrays,Reactjs,Foreach,Javascript Objects,我有一个从数据库中提取的数据集。它是一维的,我基本上需要使它更结构化。我称之为“平坦” 我需要显示一个标题,以及该标题下与标题相关的项目 数据以具有和节名(标题)和项目名(项目)以及每个项目特有的其他数据(如下载URL等)的形式出现 项目名称(项目)\章节名称(标题) 第一基金 第二基金 第三个基金 第四种文学 第五种文学 第六文学 第七部文学 第八次双勤 我不知道项目或部分的名称,或者每个部分有多少项目、部分或项目。正如我所说,它非常平坦。这需要是完全动态的,这就是为什么这对我来说是复杂的事情
_generateInfo() {
let dataArray = this.state.stepTwoData
let newArray =[]
dataArray.forEach(function(item, index) {
let newObject = {}
if (index > 0) {
if (newArray.length === 0 || item.investor_portal_section_name !== dataArray[index -1].investor_portal_section_name) {
newObject["name"] = item.investor_portal_section_name
newObject["items"] = []
newArray.push(newObject)
}
})
console.log(newArray)
}
我尝试将项目推送到我的新对象上的“数字”数组,但似乎无法正常工作。有时它会复制我的newObject.name
检查newObject.name==数组中的节名称,并将其推送到我的新对象中的“number”数组,只会创建新的键值对,因此它仍然不相关
我尝试在if语句中再次循环,if部分_name===newObject.name然后创建一个newObject并推送它,但它只会重复推送其中一个项,而不是全部推送
我需要循环并创建一个标题(每个不同的节名有一个标题)。然后将与节名对应的每个项目添加到标题中。如下所示
[
{section_name(header): "Funds",
items: [
{
name: item_name,
sku: item_sku,
url: item_url
},
{
name: item_name,
sku: item_sku,
url: item_url
}]
},
{section_name(header):"Literature",
items: [
{name: item_name,
sku: item_sku,
url: item_url
},
{
name: item_name,
sku: item_sku,
url: item_url
}]}
]
使用关联数组(字典)将数据按类别进行分隔将完成这项工作。
我起草了一些说明这个想法的POC代码。其中的关键元素是buildAssociationArray
函数
const raw_data = [
{item_name: "first", section_name: "Funds"},
{item_name: "second", section_name: "Funds"},
{item_name: "third", section_name: "Funds"},
{item_name: "fourth", section_name: "Literature"},
{item_name: "fifth", section_name: "Literature"},
{item_name: "sixth", section_name: "Literature"},
{item_name: "seventh", section_name: "Literature"},
{item_name: "eighth", section_name: "DueDilligence"},
]
function buildAssociativeArray(data) {
const dictionary = {};
for (var i = 0; i < data.length; i++) {
const item = data[i];
const section = item.section_name;
var dictEntry = dictionary[section];
if (!dictEntry) {
dictEntry = [];
dictionary[section] = dictEntry;
}
dictEntry.push({
name: item.item_name,
// other fields like sku: item_sku or url: item_url may follow here
});
}
return dictionary;
}
const dictionary = buildAssociativeArray(raw_data);
console.log(dictionary);
/*
At this point
dictionary == {
"Funds": [
{
"name": "first"
},
{
"name": "second"
},
{
"name": "third"
}
],
"Literature": [
{
"name": "fourth"
},
{
"name": "fifth"
},
{
"name": "sixth"
},
{
"name": "seventh"
}
],
"DueDilligence": [
{
"name": "eighth"
}
]
}
*/
// Associcative array dictionary itself allows to further solve you task using for (var key in dictionary) {...} operator
// If however you need to obtain the data structure looking exactly like the one in your question you may go further with following function
function transformAssociativeArray(dictionary) {
const array = [];
for (var key in dictionary) {
const items = dictionary[key];
const newEntry = {
section_name: key,
items: items,
}
array.push(newEntry);
}
return array;
}
const array = transformAssociativeArray(dictionary);
console.log(array);
/*
At this point
array == [
{
"section_name": "Funds",
"items": [
{
"name": "first"
},
{
"name": "second"
},
{
"name": "third"
}
]
},
{
"section_name": "Literature",
"items": [
{
"name": "fourth"
},
{
"name": "fifth"
},
{
"name": "sixth"
},
{
"name": "seventh"
}
]
},
{
"section_name": "DueDilligence",
"items": [
{
"name": "eighth"
}
]
}
]
*/
const原始数据=[
{项目名称:“第一”,章节名称:“资金”},
{项目名称:“第二”,章节名称:“资金”},
{项目名称:“第三”,章节名称:“资金”},
{项目名称:“第四”,章节名称:“文学”},
{项目名称:“第五”,章节名称:“文学”},
{项目名称:“第六”,章节名称:“文学”},
{项目名称:“第七”,章节名称:“文学”},
{项目名称:“第八”,章节名称:“决斗”},
]
函数buildAssociateArray(数据){
常量字典={};
对于(变量i=0;i