在LODASH中,断言对象或数组中是否存在键的最佳方法是什么?

时间:2017-05-26 19:49:48

标签: javascript arrays object frontend lodash

在我的项目中,我可以收到两种不同的回复:

var data ={
  'ADULT':{},
  'bounds':[],
  'checkInEligible':true,
  'departureDate':'2016-07-15',
  'id':'car'
}

或者我也可以得到答复:

var data = {
  ADULT:{
    'confirmationNumber':'29YNK',
    'checkInEligible':true
  },
  bounds:[],
  departureDate:"2016-07-15",`enter code here`
  id:"air"
}

我需要使用一些lodash方法断言密钥'checkInEligible'在某个级别存在于响应中。

我尝试过使用.some方法,但似乎只对数组工作正常,而且仅适用于根级别,因为只有在根级别的对象os时才返回true。

我试过这个:

isCheckInEligible: function () {
    return _.some(data, function (value, key) {
        return key === 'checkInEligible' && value
    });
}

或者这个:

isCheckInEligible: function () {
    return _.some(data, 'checkInEligible');
}

有人可以帮助我使用这种lodash方法或任何其他lodash方法吗? 但我必须使用lodash。

谢谢!

3 个答案:

答案 0 :(得分:1)

也许使用_.has

isCheckInEligible: () => {
    return _.has(data, 'checkInEligible') || _.has(data, 'ADULT.checkInEligible');
}

答案 1 :(得分:1)

您可以使用lodash#some遍历对象和数组,以检查任何级别中是否存在某个键。只需确保将lodash#some iteratee命名为递归遍历对象/数组。

function hasKeyDeep(object, key) {
  return _.has(object, key) || _.isObject(object) &&
    _.some(object, _.partial(hasKeyDeep, _, key));
}

function hasKeyDeep(object, key) {
  return _.has(object, key) || _.isObject(object) &&
    _.some(object, _.partial(hasKeyDeep, _, key));
}

console.log(hasKeyDeep({
  'ADULT':{},
  'bounds':[],
  'checkInEligible':true,
  'departureDate':'2016-07-15',
  'id':'car'
}, 'checkInEligible')); // => true

console.log(hasKeyDeep({
  'ADULT':{},
  'bounds':[],
  'departureDate':'2016-07-15',
  'id':'car'
}, 'checkInEligible')); // => false

console.log(hasKeyDeep({
  ADULT:{
    'confirmationNumber':'29YNK',
    'checkInEligible':true
  },
  bounds:[],
  departureDate:"2016-07-15",
  id:"air"
}, 'checkInEligible')); // => true

console.log(hasKeyDeep({
  ADULT:{
    'confirmationNumber':'29YNK'
  },
  bounds:[],
  departureDate:"2016-07-15",
  id:"air"
}, 'checkInEligible')); // => false

console.log(hasKeyDeep({
  bounds:[{
    'checkInEligible': true,
    'otherValue': 'another value'
  }]
}, 'checkInEligible')); // => true

console.log(hasKeyDeep({
  bounds:[{
    'otherValue': 'another value'
  }]
}, 'checkInEligible')); // => false

console.log(hasKeyDeep({
  a: [{
      b: [{
        c: [{
          d: [{
            'checkInEligible': true
          }]
        }]
      }]
  }]
}, 'checkInEligible')); // => true

console.log(hasKeyDeep({
  a: [{
      b: [{
        c: [{
          d: [{
            'anotherKey': true
          }]
        }]
      }]
  }]
}, 'checkInEligible')); // => false
body > div { top: 0; min-height: 100%; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

另一种方法是使用RegExp#test在字符串化对象中使用JSON#stringify

function hasKeyDeep(object, key) {
  return new RegExp('[{,]"' + key + '":')
    .test(JSON.stringify(object));
}

function hasKeyDeep(object, key) {
  return new RegExp('[{,]"' + key + '":')
    .test(JSON.stringify(object));
}

console.log(hasKeyDeep({
  'ADULT':{},
  'bounds':[],
  'checkInEligible':true,
  'departureDate':'2016-07-15',
  'id':'car'
}, 'checkInEligible')); // => true

console.log(hasKeyDeep({
  'ADULT':{},
  'bounds':[],
  'departureDate':'2016-07-15',
  'id':'car'
}, 'checkInEligible')); // => false

console.log(hasKeyDeep({
  ADULT:{
    'confirmationNumber':'29YNK',
    'checkInEligible':true
  },
  bounds:[],
  departureDate:"2016-07-15",
  id:"air"
}, 'checkInEligible')); // => true

console.log(hasKeyDeep({
  ADULT:{
    'confirmationNumber':'29YNK'
  },
  bounds:[],
  departureDate:"2016-07-15",
  id:"air"
}, 'checkInEligible')); // => false

console.log(hasKeyDeep({
  bounds:[{
    'checkInEligible': true,
    'otherValue': 'another value'
  }]
}, 'checkInEligible')); // => true

console.log(hasKeyDeep({
  bounds:[{
    'otherValue': 'another value'
  }]
}, 'checkInEligible')); // => false

console.log(hasKeyDeep({
  a: [{
      b: [{
        c: [{
          d: [{
            'checkInEligible': true
          }]
        }]
      }]
  }]
}, 'checkInEligible')); // => true

console.log(hasKeyDeep({
  a: [{
      b: [{
        c: [{
          d: [{
            'anotherKey': true
          }]
        }]
      }]
  }]
}, 'checkInEligible')); // => false
body > div { top: 0; min-height: 100%; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

答案 2 :(得分:0)

这是递归检查对象has-a树,以查看是否有任何包含的对象具有您正在查找的属性(对象属性)。

function nestedHas(object, attrib) {
  if (_.has(object, attrib)) {
    return true;
  }
  for (let key in _.pickBy(object, _.isObject)) {
    if (nestedHas(object[key], attrib)) {
      return true;
    }
  }
  return false;
}

注意:这不会检查数组中的键,只检查对象。