下划线js将对象数组映射到新数组的多个属性

时间:2016-07-22 17:31:21

标签: javascript arrays object underscore.js

var items = [{
  //other properties... above
  item_name: [
    [1],
    [2, 3]
  ],
  item_description: [
    [1],
    [3, 4]
  ],
  item_quantity: [
    [1],
    [4, 5]
  ],
  item_value: null,
}, {
  //other properties... above
  item_name: 1,
  item_description: 2,
  item_quantity: 3,
  item_value: 4,
}, {
  //other properties... above
  item_name: [1, 2, 3],
  item_description: [1, 2, 3],
  item_quantity: [1, 2, 3],
  item_value: [1, 2, 3],
}];

var itemList = [];



items.forEach(function(item) {

  if (!_.isArray(item.item_name)) {
    itemList.push({
      name: item.item_name,
      description: item.item_description,
      quantity: item.item_quantity,
      value: item.item_value
    });
  }

  var names = item.item_name ? _.flatten(item.item_name) : [];
  var descriptions = item.item_description ? _.flatten(item.item_description) : [];
  var quantity = item.item_quantity ? _.flatten(item.item_quantity) : [];
  var values = item.item_value ? _.flatten(item.item_value) : [];

  names.forEach(function(name, index) {
    itemList.push({
      name: names[index],
      description: descriptions[index],
      quantity: quantity[index],
      values: values[index]
    });
  })
  

});
console.log(itemList);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.1/underscore-min.js"></script>

有没有办法可以在下划线中更快地执行此操作,以删除所有的展平?

我正在拍摄的数组中的每个项目

item_name[i]
item_description[i]
item_quantity[i]
item_value[i]

并将它们添加到itemList

项目中的

项属性可以是[[],[]]或[]或整数或null

目前它正在输出预期的内容(除非名称为空且可以跳过项目)但是我不喜欢这个正在执行的所有循环而且我想知道我是否可以更好地利用下划线库

1 个答案:

答案 0 :(得分:1)

您可以使用:

var myKeys = ['name', 'description', 'quantity', 'value'];
var result = _.flatten(items.map(function(item) {
    return _.zip.apply(_, myKeys.map(function(key) {
        return _.flatten([item['item_'+key]]);
    })).map(function(arr) {
        return _.object(myKeys, arr);
    });
}));

演示:

&#13;
&#13;
var items = [{
    //other properties... above
    item_name: [
        [1],
        [2, 3]
    ],
    item_description: [
        [1],
        [3, 4]
    ],
    item_quantity: [
        [1],
        [4, 5]
    ],
    item_value: null,
}, {
    //other properties... above
    item_name: 1,
    item_description: 2,
    item_quantity: 3,
    item_value: 4,
}, {
    //other properties... above
    item_name: [1, 2, 3],
    item_description: [1, 2, 3],
    item_quantity: [1, 2, 3],
    item_value: [1, 2, 3],
}];
var myKeys = ['name', 'description', 'quantity', 'value'];
var result = _.flatten(items.map(function(item) {
    return _.zip.apply(_, myKeys.map(function(key) {
        return _.flatten([item['item_'+key]]);
    })).map(function(arr) {
    	return _.object(myKeys, arr);
    });
}));
console.log(result);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.1/underscore-min.js"></script>
&#13;
&#13;
&#13;