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

时间:2015-04-13 18:29:30

标签: javascript underscore.js

我希望准备一个发送对象。它最初看起来像这样:

var myObj = {"state":{"Saved":true,"Committed":false,"Published":false},"discipline":{"Marketing":true}};

需要通过查看内部对象并将其转换为值为true的对象的键数组来进行更改。所以在这个例子中它会改变为:

 {"state":["Saved"],"discipline":["Marketing"]};

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

这是我到目前为止所尝试的内容:

                function mutate() {
                   //map obj
                    return _.map(myObj, function(object){ 
                     //pluck keys that have = true
                        return _.keys(_.pick(object[0], Boolean));
                     });
                }

稍微苦苦挣扎,以及如何正确遍历和构建它。我使用下划线 - 但如果它更有意义,普通的JavaScript是好的。谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用mapreduceObject.keys在vanilla JS中解决此问题:



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);

<pre id="results"></pre>
&#13;
&#13;
&#13;

这适用于:

  1. 获取外部对象的键并将每个键减少为该键上true值的集合。
  2. 在减少中,我们:
    1. 仅过滤真值
    2. 仅返回每个值的键
  3. 该算法相当简单,几乎可以与你抛出的任何对象一起使用。您可以轻松更改过滤器,可以尝试一些优化。

    等同于下划线的是:

    &#13;
    &#13;
        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);
    &#13;
    <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
    <pre id="results"></pre>
    &#13;
    &#13;
    &#13;

答案 1 :(得分:1)

你的答案几乎就在那里。使用_.mapObject保留密钥而不是地图。

    var result = _.mapObject(myObj, function(value){
        return _.keys(_.pick(value, Boolean));
    });