相当于Lodash _.get和_.has的下划线

时间:2017-02-04 15:43:38

标签: javascript underscore.js lodash

我正在尝试为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

3 个答案:

答案 0 :(得分:5)

据我所知,undercore不执行深度搜索,因此您必须选择浅层hasget(或更改为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);
            }
        }
    }
});

查看示例

&#13;
&#13;
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;
&#13;
&#13;

答案 2 :(得分:0)

使用underscore.get模块

const {get} = require('underscore.get');

Underscore.Get