Более простой способ получить значение из массива - PullRequest
0 голосов
/ 11 января 2019

Есть ли более простой способ получить значение "TestProject" в ответе JSON вместо использования цикла for в моем коде?

[
    {
        "Id": "9ac44c1d-0066-47aa-a2a2-a9b90109b0a5",
        "Group": null,
        "DataFields": [
            {
                "Header": "ProjectID",
                "Value": "TestProject"
            },
            {
                "Header": "uui_ConfigPack",
                "Value": "75e8ce5a-7ae0-41ca-86f0-aca1e7158073"
            }
        ],
        "HasDocuments": null
    }
]
var projResults = JSON.parse(responseBody);

var projNumber = 1;

dataProjectId = projResults[projNumber].Id;

projName = 'Not Found';
for (i = 0; i < projResults[projNumber].DataFields.length; i++)
    {
        if(projResults[projNumber].DataFields[i].Header == "ProjectID")
        {
            projName = projResults[projNumber].DataFields[i].Value;
        }
    }

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Я бы посоветовал прочитать о методах Array, таких как:

  • карта
  • фильтр
  • уменьшить ... Эти функции помогут вам эффективно управлять вашими массивами, сделают ваш код более чистым и легким для чтения. Более подробную информацию вы найдете здесь:

https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Array/map

И я предлагаю «javascript 30» от wesbos, у него есть замечательное видео об этом :)

0 голосов
/ 11 января 2019

Вы можете использовать функции более высокого порядка, такие как map filter reduce и т. Д. чтобы избежать петель.

вот 1 вкладыш:

var obj = [
    {
        "Id": "9ac44c1d-0066-47aa-a2a2-a9b90109b0a5",
        "Group": null,
        "DataFields": [
            {
                "Header": "ProjectID",
                "Value": "TestProject"
            },
            {
                "Header": "uui_ConfigPack",
                "Value": "75e8ce5a-7ae0-41ca-86f0-aca1e7158073"
            }
        ],
        "HasDocuments": null
    }
]

console.log(obj.map(i => i.DataFields).flat(1).find(i => i.Header === 'ProjectID').Value);

Как заявлено CertainPerformance и влаз. Это приведет к снижению производительности из-за нескольких итераций.

Но если вам нравится декларативный стиль кодирования, вы можете использовать RxJS в котором вы можете сделать что-то вроде:

var obs$ = from(obj);
obs$.pipe(
  flatMap(i => i.DataFields),
  filter(i => i.Header === 'ProjectID' )),
  pluck('Value')
).subscribe(console.log);

, который в основном делает то же самое, но более производительным образом.

0 голосов
/ 11 января 2019

Похоже, вы пытаетесь найти объект в массиве, для которого наиболее идиоматическим методом является Array.prototype.find:

var projResults = [
    {
        "Id": "9ac44c1d-0066-47aa-a2a2-a9b90109b0a5",
        "Group": null,
        "DataFields": [
            {
                "Header": "ProjectID",
                "Value": "TestProject"
            },
            {
                "Header": "uui_ConfigPack",
                "Value": "75e8ce5a-7ae0-41ca-86f0-aca1e7158073"
            }
        ],
        "HasDocuments": null
    }
];
var projNumber = 0;
const foundObj = projResults[projNumber].DataFields.find(({ Header }) => Header === 'ProjectID');
const projName = foundObj ? foundObj.Value : 'Not Found';
console.log(projName);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...