在我的项目中,我可以收到两种不同的回复:
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。
谢谢!
答案 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;
}
注意:这不会检查数组中的键,只检查对象。