1

我有一个对象数组:

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 个对象数组:一个包含只有 field1 和 field 3 的对象,另一个包含具有所有其余部分的对象。我正在尝试使用下划线(好吧,实际上是 LoDash - 但它们是相同的),到目前为止,我得到的只是:

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

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

4

6 回答 6

2

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

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

}, [[], []]);
于 2013-08-29T18:14:53.427 回答
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);
于 2016-04-10T17:50:35.650 回答
1

下划线Array.prototype.forEach对其别名使用本机方法_.forEach。如果它不存在,那么它将forEach使用简单的 for 循环定义自己的迭代器。显然,对于简单的 for 循环来说,native 的性能forEach 并不是那么好。这是因为本机在迭代时forEach会执行大量检查。

我只能建议你重新定义_.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;
        }
    }
}

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

于 2013-08-29T20:47:38.723 回答
0
var arrs = _.groupBy(arr, function(obj) {
    return 'field1' in obj && 'field3' in obj;
});

这将返回一个具有名为trueand的属性的对象false

于 2013-08-29T18:00:36.523 回答
0
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:
  });
}
于 2013-08-29T18:07:01.843 回答
-1
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);
于 2013-10-01T04:12:16.927 回答