【问题标题】:Javascript/Underscore, turn array of booleans into array of stringsJavascript/Underscore,将布尔数组转换为字符串数组
【发布时间】:2015-04-11 03:03:59
【问题描述】:

所以我试图完成将布尔数组转换为字符串数组(仅设置为 true 的布尔值)。这可以是javascript,也可以是下划线。让我告诉你我的意思。

我有一个这样的数组:

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

我正在寻找的最终结果是:

[{"item1" : ["one"]}, {"item2" : ["two"]}];

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

这是我糟糕的尝试:

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

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

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

                });

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

例如

 [{"one":true, "two": false}]

会变成

  ["one"]

因为二是假的。

【问题讨论】:

  • 1) 你试过什么,2) 你的意思是[{"item1" : ["one"]}, {"item2" : ["two"]}]

标签: javascript arrays underscore.js


【解决方案1】:

lodash:

1) 选择一个值为真的对象的属性:

_.pick(object, Boolean)

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

_.keys(_.pick(object, Boolean))

3) 对每个item_.mapValues 执行上述操作(这就像对对象执行Array.prototype.map

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

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>')
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.6.0/lodash.min.js"&gt;&lt;/script&gt;

更新underscore

还好大部分方法都支持下划线,我唯一要做的就是把_.mapValues改成_.mapObjectsource

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>')
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore.js"&gt;&lt;/script&gt;

【讨论】:

  • 这是一个很好的答案。这是一个更大的项目,它在里面,它使用下划线,这可能用下划线吗?
  • 是的,我不知道下划线有类似的方法,我已经更新了我的答案
【解决方案2】:

此功能将允许您生成所需的结果。 'For in' 对于访问对象键很有用,我做了两次。可能有一种更优雅的方式来实现此功能。如果你给我更多的信息,我可以试着帮助你吗?

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

arr.map(function(item){
    for(key in item){
        for(innerKey in item[key][0]){
            if(item[key][0][innerKey]){
                var obj = {};
                obj[key] = [innerKey];
                return obj;
            } 
        }
    }
});

JavaScript set object key by variable

【讨论】:

    猜你喜欢
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2016-01-03
    • 1970-01-01
    • 2013-02-12
    • 2020-12-23
    相关资源
    最近更新 更多