Javascript/Underscore,将布尔数组转换为字符串数组

ajm*_*jma 1 javascript arrays underscore.js

所以我试图将一个布尔数组转换为一个字符串数组(只有被设置为true的布尔值).这可以是javascript或下划线.让我告诉你我的意思.

我有这样一个数组:

 [{"item1" : [{"one": true, "two": false}]}, {"item2" : [{"one": false, "two": true}]}];
Run Code Online (Sandbox Code Playgroud)

我要找的最终结果是:

[{"item1" : ["one"]}, {"item2" : ["two"]}];
Run Code Online (Sandbox Code Playgroud)

值得一提的是,所有这些键都是动态的.我似乎无法想象我应该如何遍历此数组来完成此任务.越简单越好!谢谢!

这是我的不良尝试:

  $scope.testObject = _.map($scope.filterArray, function(obj) {

                    _.map(obj.values, function(value) {

                        if (value === true) {
                            return value;
                        }
                    });

                });
Run Code Online (Sandbox Code Playgroud)

(这不起作用).我想要完成的是将这些对象的值(例如[{"one":true,"two":false}]转换为字符串数组,字符串是设置为的项的键真正.

所以举个例子

 [{"one":true, "two": false}]
Run Code Online (Sandbox Code Playgroud)

会变成

  ["one"]
Run Code Online (Sandbox Code Playgroud)

因为两个是假的.

Mau*_*ppe 6

lodash:

1)选择值为truthy的对象的属性:

_.pick(object, Boolean)
Run Code Online (Sandbox Code Playgroud)

2)抓取值为truthy的对象属性的键:(结合上面的解决方案)

_.keys(_.pick(object, Boolean))
Run Code Online (Sandbox Code Playgroud)

3)对每个item进行上述操作_.mapValues(就像Array.prototype.map在对象上执行一样)

_.mapValues(item, function (value) {
   return _.keys(_.pick(value[0], Boolean));
});
Run Code Online (Sandbox Code Playgroud)

var arr = [{"item1" : [{"one":true, "two": false}]}, {"item2" : [{"one":false, "two": true}]}];

function run () {
  return _.map(arr, function (item) {
    return _.mapValues(item, function (value) {
       return _.keys(_.pick(value[0], Boolean));
    });
  })
}

document.write('<pre>' + JSON.stringify(run(), null, 2) + '</pre>')
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.6.0/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

更新:使用下划线:

幸运的是,大多数方法都受到下划线的支持,我唯一需要改变的是_.mapValues改为_.mapObject(源代码)

var arr = [{"item1" : [{"one":true, "two": false}]}, {"item2" : [{"one":false, "two": true}]}];

function run () {
  return _.map(arr, function (item) {
    return _.mapObject(item, function (value) {
      return _.keys(_.pick(value[0], Boolean));
    });
  })
}

document.write('<pre>' + JSON.stringify(run(), null, 2) + '</pre>')
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore.js"></script>
Run Code Online (Sandbox Code Playgroud)