【问题标题】:JavaScript - Loop through Object to find Specific Key ValueJavaScript - 遍历对象以查找特定的键值
【发布时间】: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); 它不会打印任何内容。

标签: javascript arrays json node.js loops


【解决方案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);
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-28
      • 2017-08-30
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多