首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript,使用下划线(或不带下划线)转换对象

Javascript,使用下划线(或不带下划线)转换对象
EN

Stack Overflow用户
提问于 2015-04-13 18:29:30
回答 2查看 74关注 0票数 2

我想准备一个可以发送的物品。最初看起来是这样的:

代码语言:javascript
运行
复制
var myObj = {"state":{"Saved":true,"Committed":false,"Published":false},"discipline":{"Marketing":true}};

需要通过查看内部对象并将其转换为值为真的对象的键数组来进行更改。因此,在这个例子中,它将转换为:

代码语言:javascript
运行
复制
 {"state":["Saved"],"discipline":["Marketing"]};

(提交和发布被删除,因为它们被设置为false。)

以下是我迄今尝试过的:

代码语言:javascript
运行
复制
                function mutate() {
                   //map obj
                    return _.map(myObj, function(object){ 
                     //pluck keys that have = true
                        return _.keys(_.pick(object[0], Boolean));
                     });
                }

努力解决这个问题,以及如何正确地遍历和构建它。我使用的是下划线--但是如果简单的javascript更有意义的话,就可以了。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-13 18:36:20

您可以使用mapreduceObject.keys在vanilla中解决这一问题。

代码语言:javascript
运行
复制
var myObj = {
  "state": {
    "Saved": true,
    "Committed": false,
    "Published": false
  },
  "discipline": {
    "Marketing": true
  }
};

var output = Object.keys(myObj).reduce(function(p, collection) {
  var values = myObj[collection];
  p[collection] = Object.keys(values).filter(function(key) {
    return values[key] === true;
  });
  return p;
}, {});

document.getElementById('results').textContent = JSON.stringify(output);
代码语言:javascript
运行
复制
<pre id="results"></pre>

这项工作是通过以下方式进行的:

  1. 获取外部对象的键,并将每个键缩减为该键上的true值的集合。
  2. 在减缩中,我们:
    1. 只过滤真值
    2. 只返回每个值的键

该算法相当简单,应该适用于几乎所有抛向它的对象。您可以轻松地更改筛选器,并且可能会有一些优化,您可以尝试。

与下划线对应的内容如下:

代码语言:javascript
运行
复制
    var myObj = {
      "state": {
        "Committed": false,
        "Saved": true,
        "Published": false
      },
      "discipline": {
        "Marketing": true
      }
    };

    var output = _.reduce(myObj, function(p, values, collection) {
      p[collection] = _.chain(values).map(function(value, key) {
        console.log('filter', arguments);
        if (value === true) {
          return key;
        }
      }).filter(function(it) {
        return !!it;
      }).value();
      return p;
    }, {});

    document.getElementById('results').textContent = JSON.stringify(output);
代码语言:javascript
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<pre id="results"></pre>

票数 2
EN

Stack Overflow用户

发布于 2015-04-13 19:15:20

你的答案差一点就到了。使用_来保留键而不是映射。

代码语言:javascript
运行
复制
    var result = _.mapObject(myObj, function(value){
        return _.keys(_.pick(value, Boolean));
    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29612479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档