【问题标题】:Pick and display value which are greater than 0 only仅选择并显示大于 0 的值
【发布时间】:2016-03-10 06:40:17
【问题描述】:

我有以下数据结构,

var stat = {
  meta : 0,

  added : {
    menuSessions: {
      items: 0,
      fields: 0
    },

    menuCats: {
      items: 0,
      fields: 0
    },

    menuItems: {
      items: 0,
      fields: 0
    }
  },

  updated: {
    menuSessions: {
      items: 0,
      fields: 0
    },

    menuCats: {
      items: 0,
      fields: 3
    },

    menuItems: {
      items: 3,
      fields: 0
    }
  },

  deleted: {
    menuSessions: 1,
    menuCats: 10,
    menuItems: 0
  }
};

并希望使用lodash 导出如下结构,

var stat = {
  //meta not shown
  //added not shown
  updated: {
    menuCats: {
      //items not show etc..
      fields: 3
    },

    menuItems: {
      items: 3,
    }
  },

  deleted: {
    menuSessions: 1,
    menuCats: 10,
  }
};

我尝试了很多方法,例如使用filter 方法如下或纯JS(如果更简单),

var json  = _.filter(stat, function(statEle){

    return statEle > 0 || ((statEle.added && statEle.added.menuSessions) && (statEle.added.menuSessions.items > 0 || statEle.added.menuSessions.fields > 0))
    || ((statEle.updated && statEle.updated.menuSessions) && (statEle.updated.menuSessions.items > 0 || statEle.updated.menuSessions.fields > 0))
    || ((statEle.deleted && statEle.deleted.menuSessions) && (statEle.deleted.menuSessions > 0))
    || ((statEle.added && statEle.added.menuCats) && (statEle.added.menuCats.item > 0 || statEle.added.menuCats.fields > 0))
    || ((statEle.added && statEle.added.menuItems) && (statEle.added.menuItems.items > 0 ||  statEle.added.menuItems.fields > 0))
    || ((statEle.deleted && statEle.deleted.menuItems) && (statEle.deleted.menuItems > 0))
    || ((statEle.deleted && statEle.deleted.menuCats) && (statEle.deleted.menuCats > 0));

  });

如 -Lodash: how do I use filter when I have nested Object? 所示,但由于此结构需要过滤动态属性名称而失败。

我对 JSON 过滤器和 lodsash 堆栈非常陌生,如果有任何有用的参考/示例来帮助我完成这项工作,我将不胜感激:) 谢谢

【问题讨论】:

    标签: javascript json nested lodash


    【解决方案1】:

    如果您将_.mapValues_.pickBy 结合使用,您的答案就是:pickByRecursive

    var pickByRecursive = function (object, predicate) {
        return _.pickBy(_.mapValues(object, function (value) {
            return _.isObject(value) ? pickByRecursive(value, predicate) : value;
        }), function (value) {
            return _.isObject(value) ? !_.isEmpty(value) : predicate(value);
        });
    };
    

    或者_.chain:

    var pickByRecursive = function (object, predicate) {
        return _.chain(object)
            .mapValues(function (value) {
                return _.isObject(value) ? pickByRecursive(value, predicate) : value;
            })
            .pickBy(function (value) {
                return _.isObject(value) ? !_.isEmpty(value) : predicate(value);
            })
        .value();
    };
    

    像这样使用它:

    pickByRecursive(stat, function (value) {
        return value > 0;
    });
    

    【讨论】:

    • 非常感谢您的回复..我会检查并回复您
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 2018-02-26
    • 2012-01-24
    • 2019-01-13
    • 1970-01-01
    相关资源
    最近更新 更多