【问题标题】:How retrieve json element by key (Javascript)如何按键检索json元素(Javascript)
【发布时间】:2021-05-02 21:47:43
【问题描述】:

我想从这个 json 对象中检索带有键“2021-05-14”的选项。

{
  stock: {
    zip: '95014',
    lastUpdated: '05/02/2021'
  },
  options: [
    { '2021-05-07': [Object] },
    { '2021-05-14': [Object] },
    { '2021-05-21': [Object] },
    { '2021-05-28': [Object] },
    { '2021-06-04': [Object] },
    { '2021-06-18': [Object] }
  ]
}

我试过了:

var options;
var expirationSeries;
options = res.body.options;  // res.body is the json-object
for (var key in options)
{
  if (key=='2021-05-14') {
    expirationSeries = options[key];
  };
}
console.log(expirationSeries);

然后我收到错误“未定义”。

如何正确地做到这一点?

【问题讨论】:

  • 您是否调试过您的代码或添加console.log(key) 以查看它返回的内容?您需要遍历数组并检查每个对象是否具有键'2021-05-14'
  • 您的 JSON 选项似乎是 json 对象数组,所以 key 是一个数字,而不是您上面提到的日期。
  • 这可以通过多种方式完成,但也许对您的代码稍作改动,这可能会更简单。如果您的options 集合的顺序不重要,您可以将其转换为对象而不是数组,只需使用options{'2021-05-07': [Object],'2021-05-14': [Object],'2021-05-21': [Object]},只需使用options['2021-05-14'] 即可实现您想要做的事情
  • 使用console.log 看看你得到了什么。请注意,for (var k in ["first", "second"]) { 会给出0, 1,所以我想你会发现 key 是一个数字。

标签: javascript json key-value


【解决方案1】:

由于 options 是一个数组,您可以使用 find 来获取其中包含属性键的第一个对象。

const jsonData = {
  stock: {
    zip: '95014',
    lastUpdated: '05/02/2021'
  },
  options: [
    { '2021-05-07': {} },
    { '2021-05-14': {} },
    { '2021-05-21': {} },
    { '2021-05-28': {} },
    { '2021-06-04': {} },
    { '2021-06-18': {} }
  ]
 }

const key = '2021-05-21';

const result = jsonData.options.find(option => key in option );

console.log(result)

【讨论】:

    【解决方案2】:

    在数组上使用for (var key in options) 会将数组的索引分配给key 变量。

    您可以使用for..of 循环并使用hasOwnProperty 检查对象是否具有该日期作为属性。由于您只想要一个匹配项,如果找到匹配项,您可以break

    for (const o of options) {
      if (o.hasOwnProperty('2021-05-14')) {
        expirationSeries = o
        break;
      }
    }
    

    这是一个sn-p:

    let options = [{"2021-05-07":{foo:"bar"}},{"2021-05-14":{foo:"bar"}},{"2021-05-21":{foo:"bar"}},{"2021-05-28":{foo:"bar"}},{"2021-06-04":{foo:"bar"}},{"2021-06-18":{foo:"bar"}}],
        expirationSeries;
      
    for (const o of options) {
      if (o.hasOwnProperty('2021-05-14')) {
        expirationSeries = o
        break;
      }
    }
    
    console.log(expirationSeries)

    您可以使用findhasOwnProperty 来获取具有指定键的对象。如果多个对象可以拥有该键,请使用filter 获取所有匹配项

    const expirationSeries = options.find(a => a.hasOwnProperty('2021-05-21'))
    const allMatches = options.filter(a => a.hasOwnProperty('2021-05-21'))
    

    这是一个sn-p:

    const options = [{"2021-05-07":{foo:"bar"}},{"2021-05-14":{foo:"bar"}},{"2021-05-21":{foo:"bar"}},{"2021-05-28":{foo:"bar"}},{"2021-06-04":{foo:"bar"}},{"2021-06-18":{foo:"bar"}}],
        expirationSeries = options.find(a => a.hasOwnProperty('2021-05-21')),
        allMatches = options.filter(a => a.hasOwnProperty('2021-05-21'))
    
    console.log(expirationSeries)
    console.log(allMatches)

    【讨论】:

      【解决方案3】:

      你也可以试试这个:

      options.forEach(obj => {
        const key = Object.keys(obj)[0];
      
        if (key == '2021-05-14') {
          expirationSeries = options[key];
        };
      });
      

      【讨论】:

        【解决方案4】:

        您可以使用Array.find 在选项数组中查找对象。比如:

        const fromJson = {
          stock: {
            zip: '95014',
            lastUpdated: '05/02/2021'
          },
          options: [
            { '2021-05-07': {} },
            { '2021-05-14': {} },
            { '2021-05-21': {} },
            { '2021-05-28': {} },
            { '2021-06-04': {} },
            { '2021-06-18': {} },
          ]
        }
        
        const expirationSeries = findOptionByKey(`2021-05-14`);
        console.log(expirationSeries);
        
        // not found
        console.log(findOptionByKey(`2022-03-12`));
        
        
        function findOptionByKey(key2Find) {
          const keyFinder = obj => obj[key2Find];
          return fromJson.options.find(keyFinder) || `option [${key2Find}] not found`;
        }

        【讨论】:

          【解决方案5】:

          您可以尝试使用for...of,而不是for...in

          演示:

          var options;
          var expirationSeries;
          options = [
              { '2021-05-07': 'data 1' },
              { '2021-05-14': 'data 2' },
              { '2021-05-21': 'data 3' },
              { '2021-05-28': 'data 4' },
              { '2021-06-04': 'data 5' },
              { '2021-06-18': 'data 6' }
            ]
          for (var obj of options)
          {
            var k = Object.keys(obj)[0];
            if (k=='2021-05-14') {
              expirationSeries = obj[k];
            };
          }
          console.log(expirationSeries);

          或者:您可以尝试使用.find()

          var options = [
              { '2021-05-07': 'data 1' },
              { '2021-05-14': 'data 2' },
              { '2021-05-21': 'data 3' },
              { '2021-05-28': 'data 4' },
              { '2021-06-04': 'data 5' },
              { '2021-06-18': 'data 6' }
            ];
          var temp = options.find(o => Object.keys(o)[0] === '2021-05-14');
          var expirationSeries =  temp != undefined ? Object.values(temp)[0] : 'not found';
          console.log(expirationSeries);

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-11
            • 1970-01-01
            • 1970-01-01
            • 2021-08-11
            • 1970-01-01
            • 1970-01-01
            • 2021-12-20
            • 2013-01-19
            相关资源
            最近更新 更多