检查映射函数

时间:2018-04-06 15:44:52

标签: javascript json

例如,我收到了JSON响应:

[
  {
    'key_1': 'value1A',
    'key_2': 'value2A',
    'key_3': 'value3A'
  },
  {
    'key_1': 'value1B',
    'key_2': 'value2B',
  }
]

如所观察到的,在数组的第二个元素中未提供key_3。这里keys对于数组中的每个对象都是相同的。

让我们说,我有兴趣只使用响应的key_2key_3,因此我使用map如下

this.serv.getInfo(code) // HTTP GET service
  .subscribe(res => {
    this.data = res.map(el => { // only use necessary key:value pairs
      let _out = { // make an object to return

        'new_key_1': el.key_2
        'new_key_2': '' // if there is no key_3 then leave it empty

      }
      if ('key_3' in el) { // if this pair exists then add it..

        _out['new_key_2'] = el.key_3
        return _out;

      }

      return _out; // if not return with empty string
    });
  });

这种方法效果很好,因为在这种情况下JSON响应很小。但我认为如果JSON结构庞大且复杂,if(.. in el)检查可能会增加许多倍。

在将响应映射到新对象时,哪种运算符最适合用于更多动态检查。是否有必要在_opt函数中创建临时map对象?

1 个答案:

答案 0 :(得分:1)

您可以使用el['key_3'] || '',即Short-circuit evaluation

样本



let data = [
  {
    'key_1': 'value1A',
    'key_2': 'value2A',
    'key_3': 'value3A'
  },
  {
    'key_1': 'value1B',
    'key_2': 'value2B',
  }
],
  arr = data.map((el) => {
    return {'key_1': el['key_2'], 'key_2': el['key_3'] || ''};
  });

console.log(arr);




但是,它不包括el['key_3']等于nullundefinedfalse0的情况。

如果这是不可接受的,那么in运算符是真正确定对象中是否存在键的唯一方法。您可以将其与ternary operator一起使用,从而避免使用临时对象 - 请参阅演示

样本



let data = [
  {
    'key_1': 'value1A',
    'key_2': 'value2A',
    'key_3': 'value3A'
  },
  {
    'key_1': 'value1B',
    'key_2': 'value2B',
    'key_3': undefined,
  }
],
  arr = data.map((el) => {
    return {'key_1': el['key_2'], 'key_2': 'key_3' in el ? el['key_3'] : ''};
  });

console.log(arr);