Более или менее ситуация такова: я получаю массив (используя JS), и один объект (назовем его TASK) выглядит так (это не полный массив, просто ОДИН экземпляр):
{
"id": "28",
"name": "sdfsdf",
"progress": 80,
"description": "",
"code": "1",
"level": 1,
"status": "STATUS_SUSPENDED",
"depends": "",
"canWrite": true,
"start": 1444341600000,
"duration": 7,
"end": 1445291999999,
"startIsMilestone": 0,
"endIsMilestone": 0,
"collapsed": false,
"assigs": [
{
"resourceId": 3,
"otherStuff": xyz
},
{
"resourceId": 2,
"otherStuff": xyz
}
],
"hasChild": true
}
Другой загружаемый объект содержит все «ресурсы», на которые в первом массиве указано «assigs»: [] (назовем эти RESOURCES):
[
{
"ID": "1",
"name": "service | 1st resource we need",
"unit": "pcs",
"quantity": "10"
},
{
"ID": "2",
"name": "money | Office space",
"unit": "hour",
"quantity": "50"
},
{
"ID": "3",
"name": "product | Money for nothing...",
"unit": "$",
"quantity": "300"
},
{
"ID": "4",
"name": "people | Chovjek",
"unit": "people",
"quantity": "1"
}
]
Я заполняю некоторые поля формы данными задачи, но просто не могу понять, как «связать» задачу с ее ресурсами.
4 ответа
Вот так, если мы говорим о новых версиях javascript:
for(var task of tasks)
{
for(var ass of task.assigns)
{
for(var res of resources)
{
if(res.ID === ass.resourceId.toString()) {
//here res and ass match and you can do what you want
}
}
}
}
Во всех версиях JS вы можете сделать это так
for(var i = 0; i < tasks.length; i++)
{
for(var x = 0; x< tasks[i].assigns.length; x++)
{
for(var y = 0; y < resources.length; y++)
{
if(resources[y].ID === tasks[i].assigns[x].resourceId.toString()) {
//here res and ass match and you can do what you want
}
}
}
}
Возможно, это не лучший ответ, но я бы, вероятно, использовал filter ().
Вы перебираете все свои задачи (например, в цикле foreach), затем вы перебираете все асси (?) И затем делаете:
for (var task of tasks) {
for (var currentAssig of assigs) {
var resourceId = currentAssig.resourceId;
var relevantResource = RESOURCES.filter(function (res) {
return res.ID === resourceId;
});
// do whatever you want with your resource.
}
}
Я не уверен, что это то, что вы ищете, но вы должны быть в состоянии пройти через массив Task
, и внутри этого цикла, пройти через массив assigs
и внутри этот цикл, цикл через ваш Resources
массив. Делая это, вы можете найти связь.
Пример:
//Loop through Task array
for(i = 0; i < Task.length; i++){
//Loop through your assigs within the Task array, at the given index 'i'
for(j =0; j < Task[i].assigs; j++){
//Now loop through the Resources array, to find the ID that matches the assigs 'resourceId'
for(k =0; k < Resources.length; k++){
if(Task[i].assigs[j].resourceId === Resources[k].ID){
//You have the connection
}
}
}
}
ПРИМЕЧАНИЕ. это, вероятно, можно оптимизировать довольно сильно, но, по крайней мере, вот основной
РЕДАКТИРОВАТЬ: или, как это делает Кристиан Нильсен, с помощью цикла foreach
Что если вместо «resourceId» вы просто установите там свой объект Resource? У вас будет ваше соединение:
{
"id": "28",
"name": "sdfsdf",
/* .... */
"assigs": [
{
"resource":
{
"ID": "1",
"name": "service | 1st resource we need",
"unit": "pcs",
"quantity": "10"
},
"otherStuff": xyz
},
{
"resource":
{
"ID": "2",
"name": "service | 2nd resource we need",
"unit": "pcs",
"quantity": "20"
},
"otherStuff": xyz
}
],
"hasChild": true
}
Или, если вы хотите сохранить свою структуру, просто добавьте ссылку на объект, который существует в массиве Resources:
"assigs":
[
{
"resourceId": 3,
"resource": yourResourceArray[0], //<-- [0] for sake of simplicity
"otherStuff": xyz
},
{
"resourceId": 2,
"resource": yourResourceArray[1], //<-- [1] for sake of simplicity
"otherStuff": xyz
}
],
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.