Выберите родительский объект из ключа в файле JSON с помощью Javascript - PullRequest
0 голосов
/ 15 января 2020

У меня есть файл brands.JSON с:

{
  "Apple": {
    "ceo": "Steve Jobs",
     "os": "OSX"
  },
  "Microsoft": {
    "ceo": "Bill Gates",
     "os": "Windows"
  }
}

В приложении. js с сервера узла:

app.get('/pages/:brandId', (req, res) => {
  let requestedBrand = req.params.pageId;

  console.log(requestedBrand) // might return "OSX" but I want it to become "Apple"

  let brands = JSON.parse(fs.readFileSync(__dirname + '/views/data/brands.json'));

  res.render('pages/brand', {
    brand: brands[requestedBrand]
  });
})

Если я нажму на ссылку с '/pages/OSX' Я хочу, чтобы requestedBrand стал "Apple". То же самое, если URL запрашивает Bill Gates, мне нужно выбрать Microsoft.

1 Ответ

1 голос
/ 15 января 2020

Из значений объекта brands, .find того, чей объект имеет значение, совпадающее с requestedBrand, и, если оно существует, визуализируют объект:

app.get('/pages/:brandId', (req, res) => {
  let requestedBrand = req.params.pageId;

  console.log(requestedBrand) // might return "OSX" but I want it to become "Apple"

  let brands = JSON.parse(fs.readFileSync(__dirname + '/views/data/brands.json'));
  const obj = Object.values(brands).find(brand => Object.values(brand).includes(requestedBrand));
  if (obj) {
    res.render('pages/brand', {
      brand: obj
    });
  } else {
    // no object found
  }
})

Живой фрагмент:

const brands = {
  "Apple": {
    "ceo": "Steve Jobs",
     "os": "OSX"
  },
  "Microsoft": {
    "ceo": "Bill Gates",
     "os": "Windows"
  }
};
const requestedBrand = prompt('Brand?');
const obj = Object.values(brands).find(brand => Object.values(brand).includes(requestedBrand));
if (obj) {
  console.log(obj);
} else {
  console.log('no match');
}

Это только дает вам цель для бренда, потому что, похоже, это все, что вы хотите для brand: brands[requestedBrand] - кажется, вы не на самом деле нужен ключ, связанный с ним. Если вам нужен ключ, итерируйте Object.entries вместо Object.values:

const brands = {
  "Apple": {
    "ceo": "Steve Jobs",
     "os": "OSX"
  },
  "Microsoft": {
    "ceo": "Bill Gates",
     "os": "Windows"
  }
};
const requestedBrand = prompt('Brand?');
const entry = Object.entries(brands).find(([, brand]) => Object.values(brand).includes(requestedBrand));
if (entry) {
  // entry[1] is the object
  console.log(entry[0], entry[1]);
} else {
  console.log('no match');
}

Возможно, вы захотите выполнить поиск без учета регистра:

const lowerBrand = requestedBrand;
const entry = Object.entries(brands).find(([, brand]) => (
  Object.values(brand).map(str => str.toLowerCase()).includes(lowerBrand)
));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...