【问题标题】:How to break an array of objects into 2 arrays, using Underscore/LoDash如何使用 Underscore/LoDash 将对象数组分成 2 个数组
【发布时间】:2013-09-02 07:05:30
【问题描述】:

我有一个对象数组:

var arr = [
  {field1: value, field2: value, field3: value, field4: value},
  {field1: value, field2: value, field3: value, field4: value},
  {field1: value, field2: value, field3: value, field4: value}
];

我需要将它分成 2 个对象数组:一个包含只有字段 1 和字段 3 的对象,另一个包含具有所有其余部分的对象。我正在尝试使用下划线(好吧,实际上是 LoDash - 但它们是相同的),到目前为止,我得到的只是:

var arr1 = [], arr2 = [];
_.forEach(arr, function(line) {
    arr1.push(_.pick(line, ['field1', 'field3']));
    arr2.push(_.omit(line, ['field1', 'field3']));
});

虽然这段代码有效,但它让我觉得效率非常低。我确定我缺少一个可以让我的生活更轻松、我的代码更易读、我的程序更高效的下划线函数。

【问题讨论】:

  • 你说效率低是什么意思?
  • 似乎发生了许多内部迭代。由于 US 和 LD 都表示他们有更好的迭代实现,我想知道是否有办法以某种方式利用它。

标签: javascript underscore.js lodash


【解决方案1】:

我认为这并不比你写的更容易阅读或更有效。但它确实使用下划线。

var arrs = _.reduce(arr, function(memo, item){

  var firstArr = _.chain(_.first(memo)).push(_.pick(item, ['field1', 'field3'])).value();
  var secondArr = _.chain(_.last(memo)).push(_.omit(item, ['field1', 'field3'])).value();

  return [ firstArr, secondArr ];

}, [[], []]);

【讨论】:

    【解决方案2】:
    var input = [
      {field1: value, field2: value, field3: value, field4: value},
      {field1: value, field2: value, field3: value, field4: value},
      {field1: value, field2: value, field3: value, field4: value}
    ];
    
    /* Generic function to get key-value pair form array of object.
     input >> is array of object.
     keys >> array of string keys.
     isNotRequired >> boolean flag whether output contains the keys which are provided or the keys except which are provided.
    */
    
    function getKeyValues(input, keys, isNotRequired) {
        if (!keys || !keys.length) {
            return input;
        }
        return _.reduce(input, function(output, values) {
            output.push(_.reduce(values, function(object, value, key) {
                if (!isNotRequired) {
                    if (keys.indexOf(key) > -1) {
                        object[key] = value;
                    }
                } else if (keys.indexOf(key) === -1) {
                    object[key] = value;
                }
                return object;
            }, {}));
            return output;
        }, []);
    }
    

    //在你的例子中热使用函数:

    var FirstArrayWithField1AndField2 = getKeyValues(input,['field1','field2']);
    var SecondArrayWithoutField1AndField2 = getKeyValues(input,['field1','field2'],true);
    

    【讨论】:

      【解决方案3】:

      Underscore 使用原生 Array.prototype.forEach 方法作为其别名 _.forEach。如果它不存在,那么它将使用简单的 for 循环定义自己的 forEach 迭代器。显然本机 forEach isn't that great 对简单 for 循环的性能。这是因为原生 forEach 在迭代时执行了 lot of checks

      我只能建议你像这样重新定义_.forEach方法 -

      _.forEach = function(obj, iterator, context) {
          if (obj == null) return;
          if (obj.length === +obj.length) {
              for (var i = 0, l = obj.length; i < l; i++) {
                  if (iterator.call(context, obj[i], i, obj) === breaker) return;
              }
          }
      }
      

      希望这能回答您的问题。快乐编码!

      【讨论】:

        【解决方案4】:
        var arrs = _.groupBy(arr, function(obj) {
            return 'field1' in obj && 'field3' in obj;
        });
        

        这将返回一个具有名为truefalse 的属性的对象。

        【讨论】:

        • 虽然这似乎解决了问题中描述的问题,但它并不等同于其中的代码。我认为 OP 必须澄清他的意图。
        • 我需要以指定的 2 个数组结束。所有字段都存在于原始数组中,因此此代码无济于事。谢谢。
        【解决方案5】:
        var i ,target,length = arr.length, arr1 = [], arr2 = [];
        for(i = 0; i< length;i++){
          target = arr[i];
          arr1.push({
            field1: target.field1, 
            field3: target.field3:
          });
          arr2.push({
            field2: target.field2, 
            field4: target.field4:
          });
        }
        

        【讨论】:

          【解决方案6】:
          var myarr = 
          [
                {'field1': 'val01', 'field2': 'val02', 'field3': 'val03', 'field4': 'val04'},
                {'field1': 'val11', 'field2': 'val12', 'field3': 'val13', 'field4': 'val14'},
                {'field1': 'val21', 'field2': 'val22', 'field3': 'val23', 'field4': 'val24'},
                {'field1': 'val31', 'field2': 'val32', 'field3': 'val33', 'field4': 'val34'}
          ];
          
          var fields13 = [];
          var fields24 = [];
          
          
          _.each(myarr, function(myobj) 
          { 
                fields13.push(myobj.field1);
                fields24.push(myobj.field2);
                fields13.push(myobj.field3);
                fields24.push(myobj.field4);
          });
          
          console.log(fields13);
          console.log(fields24);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-21
            • 2023-03-12
            • 2014-09-22
            • 1970-01-01
            • 2016-08-06
            • 1970-01-01
            • 1970-01-01
            • 2019-06-06
            相关资源
            最近更新 更多