基于对象属性,用js/lodash将数组分成几部分。

3

假设我有一个像这样的数组:

[
  { 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 }
      ]
]

很好,但我希望得到一个由三个数组组成的数组,因为我想要保留与开始数组相同的顺序。我希望得到以下结果:
[
  [
    { product: '...', price: 12 },
    { product: '...', price: 12 }
  ],
  [
    { product: '...', price: 14 }
  ],
  [
    { product: '...', price: 12 }
  ]
]

有没有相应的功能可以实现这个?

第一个和最后一个产品数组之间有什么区别? - Sebastian Sebald
你目前尝试了什么?你能把你用过的代码加到问题中吗? - evolutionxbox
问题更加复杂。我需要得到那个结果。我展示的数组比我需要处理的数组简单得多得多。我尝试了很多方法,比如分组、过滤等。 - elzoy
你是只寻找 Lodash 解决方案,还是简单的原生 JS 解决方案也可以? - gurvinder372
我重复一下Sebastian Sebald的问题: 第一个产品数组和最后一个产品数组有什么区别?是某些属性不同,还是仅仅将结果分成了两个元素? - Vitalii Andrusishyn
4个回答

3
您可以使用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


2
也许这段代码对你有帮助:

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>


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)


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接