我正在尝试为Lodash _.get
和_.has
搜索等效的Underscore,它可以直接访问嵌套对象值的存在和值,而无需检查其是否存在父母。
但是,在我看来,强调_.get
和_.has
只能检查第一级的值。
var object = { 'a': { 'b': 2 } };
_.has(object, 'a.b'); // lodash shows true
_.has(object, 'a.b'); // underscore shows false
答案 0 :(得分:5)
据我所知,undercore不执行深度搜索,因此您必须选择浅层has
和get
(或更改为lodash)。
您也可以尝试自己实现它(您可以检查lodash的实现并尝试复制它或提出自己的解决方案)。
这是has
问题的简单解决方案(get
类似),使用递归和当前下划线has
的实现。
希望它有所帮助。
var a = {
a: 1,
b: {
a: { c: { d: 1 }}
}
};
var hasDeep = function(obj, path) {
if(!path) return true;
var paths = path.split('.'),
nPath = _.first(paths);
return _.has(obj, nPath) && hasDeep(obj[nPath], _.rest(paths).join('.'));
}
console.log(hasDeep(a, 'b.a.c.d'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore.js"></script>
答案 1 :(得分:2)
您可以通过_.mixin
这就是mixin,其作用类似_.get
lodash
通过对象链进行评估,即
<强>用法强>
_.get(a, 'a[0].b');
"collectionValue1" // you will get
<强>密新强>
_.mixin({
get: function(obj, path) {
if (!obj && !path) {
return undefined;
} else {
var paths;
if (!_.isEmpty(path.match(/^\[\d\]/))) {
paths = path.replace(/^[\[\]]/g, '').split(/\./);
nPath = _.first(paths[0].replace(/\]/, ''));
} else {
paths = path.split(/[\.\[]/);
nPath = _.first(paths);
}
remainingPath = _.reduce(_.rest(paths), function(result, item) {
if (!_.isEmpty(item)) {
if (item.match(/^\d\]/)) {
item = "[" + item;
}
result.push(item);
}
return result;
}, []).join('.');
if (_.isEmpty(remainingPath)) {
return obj[nPath];
} else {
return _.has(obj, nPath) && _.get(obj[nPath], remainingPath);
}
}
}
});
查看示例
var a = {
a: [
{ b: "collectionValue1" },
{ b: "collectionValue2", list: [ { item: "listValue1" }, { item: [{value: "Working"}] }] }
],
b: {
a: {
c: {
d:"success"
}
}
}
};
_.mixin({
get: function(obj, path) {
if (!obj && !path) {
return undefined;
} else {
var paths;
if (!_.isEmpty(path.match(/^\[\d\]/))) {
paths = path.replace(/^[\[\]]/g, '').split(/\./);
nPath = _.first(paths[0].replace(/\]/, ''));
} else {
paths = path.split(/[\.\[]/);
nPath = _.first(paths);
}
remainingPath = _.reduce(_.rest(paths), function(result, item) {
if (!_.isEmpty(item)) {
if (item.match(/^\d\]/)) {
item = "[" + item;
}
result.push(item);
}
return result;
}, []).join('.');
if (_.isEmpty(remainingPath)) {
return obj[nPath];
} else {
return _.has(obj, nPath) && _.get(obj[nPath], remainingPath);
}
}
}
});
console.log(_.get(a, 'a[0].b'));
console.log(_.get(a, 'b.a.c.d'));
console.log(_.get(a, 'a[1].b'));
console.log(_.get(a, 'a[1].list[0].item'));
console.log(_.get(a, 'a[1].list[1].item[0].value'));
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
&#13;
答案 2 :(得分:0)