从数组检索值的更简单方法

时间:2019-01-11 12:05:03

标签: javascript postman

是否有比在代码中使用for循环更简单的方法来检索JSON响应中的值"TestProject"

[
    {
        "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 :(得分:2)

您似乎正在尝试在数组中查找对象,对此使用的最惯用方法是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);

答案 1 :(得分:1)

我建议阅读有关Array方法的信息,

  • 地图
  • 过滤器
  • 减少 ... 这些函数将帮助您以有效的方式管理数组,使代码看起来更简洁,易于阅读,您将在此处找到有关它的更多信息:

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

我确实建议wesbos的“ javascript 30”,他有一个很棒的视频:)

答案 2 :(得分:1)

您可以使用高阶函数,例如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);


如SomePerformance和vlaz所述。由于多次迭代,这将导致性能下降。

但是,如果您喜欢声明式编码样式,则可以使用RxJS 您可以在其中执行以下操作:

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

基本上可以完成相同的操作,但是性能更高。