js / lodash基于对象属性划分数组

时间:2017-04-11 09:20:55

标签: javascript arrays lodash

我们说我有一个像这样的数组:

[
  { product: '...', price: 12 },
  { product: '...', price: 12 },
  { product: '...', price: 14 },
  { product: '...', price: 12 }
]

我想按价格对这个数组进行分组,并使用lodash' groupBy我得到以下结果:

[
  12: [
        { product: '...', price: 12 },
        { product: '...', price: 12 },
        { product: '...', price: 12 }
      ],
  14: [
        { product: '...', price: 14 }
      ]
]

很好,但是我想要一个包含三个数组的数组,因为我想保存某些类似于start数组的顺序。我希望得到这样的结果:

[
  [
    { product: '...', price: 12 },
    { product: '...', price: 12 }
  ],
  [
    { product: '...', price: 14 }
  ],
  [
    { product: '...', price: 12 }
  ]
]

这是否有功能?

4 个答案:

答案 0 :(得分:2)

您可以使用lodash -

执行此类操作
var count = 0;
console.log(
_.values(_.groupBy(_.map(myArray, (item, index) => {
        if(index == 0) return _.merge(item, { group : 0});;
        if( myArray[index-1].price == item.price )
            return _.merge(item, { group : count});
        return  _.merge(item, { group : ++count});
        }
    ), 'group'))
);

在此处试试 - lodash-group-consequtive

答案 1 :(得分:1)

使用普通js,您可以使用forEach()循环执行此操作,并在变量中保存最后一个价格,以检查最后插入的元素是否与当前元素具有相同的价格。



var data = [
  { product: '...', price: 12 },
  { product: '...', price: 12 },
  { product: '...', price: 14 },
  { product: '...', price: 12 }
]

var result = [], last = null
data.forEach(function(e, i) {
  if(!this[e.price]) {
    this[e.price] = [e];
    result.push(this[e.price])
  } else {
    this[e.price].push(e)
  }
  if(last != e.price && i != 0) delete this[last]
  last = e.price
}, {})

console.log(result)




答案 2 :(得分:1)

也许这段代码对您有所帮助:



var myArray = [
  { product: '...', price: 12 },
  { product: '...', price: 12 },
  { product: '...', price: 14 },
  { product: '...', price: 12 }
]

var newArray = _.map(_.keyBy(myArray, "price"))

console.log(newArray)

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
&#13;
&#13;

答案 3 :(得分:1)

您可以检查最后插入的数组并使用实际价格测试第一个项目。如果匹配,则推送到最后一个数组,否则将新数组推送到结果集。

var data = [{ product: '...', price: 12 }, { product: '...', price: 12 }, { product: '...', price: 14 }, { product: '...', price: 12 }],
    result = data.reduce(function (r, a) {
        var last = r[r.length - 1] || [{}];
        if (last[0].price === a.price) {
            last.push(a);
        } else {
            r.push([a]);
        }
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }