JavaScript - 遍历对象以查找特定的键值

Posted

技术标签:

【中文标题】JavaScript - 遍历对象以查找特定的键值【英文标题】:JavaScript - Loop through Object to find Specific Key Value 【发布时间】:2017-05-26 00:31:19 【问题描述】:

我有一个名为 contentful.json 的文件,它存储在我的目录的根目录中。

这是该文件的样子:

[ "URL": "/force", "SpaceID": "2g1335I9GYQCKwmQYCuSSI" , "URL": "/heroku", "SpaceID": "2g1335I9GYQCKwmQYCuSSI" , "URL": "/slack", "SpaceID": "2g1335I9GYQCKwmQYCuSSI" , "URL": "/contentful", "SpaceID": "2g1335I9GYQCKwmQYCuSSI" , "URL": "/openShift", "SpaceID": "2g1335I9GYQCKwmQYCuSSI" ]

然后我有一个名为 contentful.js 的文件。

看起来像这样:

const fs = require('fs');

let obj;

fs.readFile('./contentful.json', 'utf8', (err, jsonData) => 
  if (err) throw err;
  obj = JSON.parse(jsonData);

  // Method One
  for (let i = 0, l = obj.length; i < l; i++) 
    console.log(obj.URL);
    // ...
  

  // Method Two
  Object.keys(obj).forEach((key) => 
    if (key.url === '/heroku') 
      console.log(key.SpaceID);
    
  );
);

我想做的是从contentful.js 文件中读取contentful.json 文件。哪个有效。

然后我试图遍历该文件并找到一个特定的值。

E.G 循环遍历 JSON 对象,如果 URL 等于动态值 (/force),则返回 SpaceID。

所以这个 JSON 对象可能 n 大。我尝试了两种解决方案,但认为我还不是他们的。

我需要在contnetful.js 文件中输入一个 URL,如果该 URL 与 contnetful.json 文件中的 URL 匹配,我希望它返回该 SpaceID。

【问题讨论】:

console.log(obj.URL) 的输出是undefined。它打印出undefined 的次数与 JSON 对象的大小一样多。在这种情况下 5. 但是对于方法二 console.log(key.SpaceID); 它不会打印任何内容。 【参考方案1】:

从此改变方法一:

  // Method One
  for (let i = 0, l = obj.length; i < l; i++) 
    console.log(obj.URL);
    // ...
  

到这里:

  // Method One
  for (let i = 0, l = obj.length; i < l; i++) 
    console.log(obj[i].URL);
    if (obj[i].URL === someVariable) 
        console.log("found match for ", someVariable);
        console.log("SpaceID = ", obj[i].SpaceID);
    
    // ...
  

您必须使用for 循环中的索引来索引obj 数组,以获取数组中该位置的对象。

如果您希望您要查找的 URL 在变量中,那么只需在比较中使用变量即可。您可以将整个内容包装在一个函数中,并将所需的字符串作为函数的参数传递给函数,然后您可以重用该函数来匹配不同的值。

【讨论】:

仍然没有动态网址。 @DominikNoll - 如果需要,可以将 "/force" 更改为变量。 这就是他问题的答案:-)【参考方案2】:

您可以使用过滤器来检查动态 URL。它将返回特定 URL 的过滤匹配。您可以从过滤结果中获取spaceID。

let obj;

let dynamicURL = "/heroku"

obj = [
  "URL": "/force",
  "SpaceID": "2g1335I9GYQCKwmQYCuSSI"
, 
  "URL": "/heroku",
  "SpaceID": "2g1335I9GYQCKwmQYCuSSI"
, 
  "URL": "/slack",
  "SpaceID": "2g1335I9GYQCKwmQYCuSSI"
, 
  "URL": "/contentful",
  "SpaceID": "2g1335I9GYQCKwmQYCuSSI"
, 
  "URL": "/openShift",
  "SpaceID": "2g1335I9GYQCKwmQYCuSSI"
]

var filtered = obj.filter(function(elem)
 return (elem.URL == dynamicURL)
);

console.log(filtered[0].SpaceID);

【讨论】:

【参考方案3】:
//Method One:
function searchForUrl(obj, url)
    for(let i = 0, l = obj.length; i < l; i++)
        if(obj[i].Url == url)
            //DO STUFF
            break; //better performance, only if the URL is unique!!
        
    


//Method Two:
function searchForUrl(obj, url)
    Object.keys(obj).forEach((key) => 
    if (key.url === url) 
      console.log(key.SpaceID);
    
);

【讨论】:

以上是关于JavaScript - 遍历对象以查找特定的键值的主要内容,如果未能解决你的问题,请参考以下文章

在对象的 json 数组中找到一个键值并返回另一个带有角度的键值

如何从 JSON 对象中获取特定的键值

ES5对象新增的方法

排序数组以及遍历普通对象的键值对以及如何遍历一个不同键值的对象数组

map集合中的键值对对象遍历

基于子对象的特定键值以排序顺序迭代 JavaScript 对象