Tengo un archivo llamado contentful.json que se almacena en la raíz de mi directorio.

Así es como se ve ese archivo:

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

Entonces tengo un archivo llamado contentful.js.

Que se ve así:

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);
    }
  });
});

Lo que intento hacer es leer el archivo contentful.json del archivo contentful.js. Que funciona

Entonces estoy tratando de recorrer ese archivo y encontrar un valor específico.

E.G recorre el objeto JSON, y donde URL equivale a un valor dinámico (/ force) me devuelve el SpaceID.

Por lo tanto, este objeto JSON podría ser n grande. He intentado dos soluciones, pero todavía no creo que sea la suya.

Necesito ingresar una URL en el archivo contnetful.js y si esa URL coincide con la URL en el archivo contnetful.json me gustaría que devuelva ese SpaceID.

1
user3180997 11 ene. 2017 a las 12:31

3 respuestas

La mejor respuesta

Cambie el método uno de esto:

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

A esto:

  // 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);
    }
    // ...
  }

Debe usar el índice en su bucle for para indexar en la matriz obj para obtener el objeto en ese punto de la matriz.

Si desea que la URL que busca esté en una variable, simplemente use una variable en su comparación. Puede envolver todo en una función y pasar la cadena deseada a la función como argumento para la función y luego puede reutilizar la función para que coincida con diferentes valores.

3
jfriend00 11 ene. 2017 a las 09:44

Puede usar el filtro para verificar la URL dinámica. Devolverá las coincidencias filtradas de una URL particular. Puede obtener el spaceID luego del resultado filtrado.

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);
1
Deep 11 ene. 2017 a las 09:38
//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);
    }
});
1
DomeTune 11 ene. 2017 a las 09:40