Более или менее ситуация такова: я получаю массив (используя 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"
  }
]

Я заполняю некоторые поля формы данными задачи, но просто не могу понять, как «связать» задачу с ее ресурсами.

1
Edi Smajic 16 Дек 2015 в 13:48

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
            }
        }
    }
}
1
Christian Nielsen 16 Дек 2015 в 11:13

Возможно, это не лучший ответ, но я бы, вероятно, использовал 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.
    }
}
0
blas3nik 16 Дек 2015 в 10:58

Я не уверен, что это то, что вы ищете, но вы должны быть в состоянии пройти через массив 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

-1
halfer 3 Июн 2018 в 23:59

Что если вместо «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
    }
],
0
Cesar 16 Дек 2015 в 11:07