我有一个 JavaScript 数组对象:
var items = [
{address: 'abc'}, {address: 'abc'}, {address: 'abc'},
{address: 'abc'}, {address: 'wer'}, {address: 'xyz'},
{address: 'xyz'}, {address: 'xyz'}
];
我想做的是,我将 2 个项目视为一个项目。如果项目的地址重复两次,我将其视为一个项目。单个唯一项目将被视为一个项目...
我希望它的输出是这样的:
[
{address: 'abc'}, {address: 'abc'},
{address: 'wer'},
{address: 'xyz'}, {address: 'xyz'}
];
以上是预期的输出..
这个概念是这样的:
abc , abc , abc SHOULD BE abc, abc
xyz , xyz, xyz SHOULD BE xyz, xyz
wer SHOULD BE wer
到目前为止我尝试过的是:
var items = [
{address: 'abc'}, {address: 'abc'}, {address: 'abc'},
{address: 'abc'}, {address: 'wer'}, {address: 'xyz'},
{address: 'xyz'}, {address: 'xyz'}
];
var itemsNew = [];
var preItem = '';
var a = 1;
var x = false;
for(var i = 0; i < items.length; i++){
var itemDeliveryAddress = items[i].address;
if(a == 2){
if(preItem == itemDeliveryAddress){
preItem = '';
a=1;
}
else {
preItem = '';
a=1;
itemsNew.push(itemDeliveryAddress);
}
}
else {
a++;
preItem = itemDeliveryAddress;
itemsNew.push(itemDeliveryAddress);
}
}
但是上面的代码没有正确对项目进行分组..我得到这个输出:
abc,abc,wer,xyz,xyz
注意:我首先按升序对数组进行排序
最佳答案
您可以使用计数器和 Array#filter
来过滤它.
The
filter()
method creates a new array with all elements that pass the test implemented by the provided function.
此提案使用 thisArg
,一个真正的空对象作为回调内部的 this
对象。
基本上,this[a.address]
是计数器,如果不存在,则初始化为零,然后加一。
计数完毕后,用计数器返回。如果值为奇数,则该项目包含在结果集中。
虽然this
在所有回调中都是持久的,但不需要排序,因为计数器不需要特定的顺序。
var items = [{ address: 'abc' }, { address: 'abc' }, { address: 'abc' }, { address: 'abc' }, { address: 'wer' }, { address: 'xyz' }, { address: 'xyz' }, { address: 'xyz' }],
result = items.filter(function (a) {
this[a.address] = (this[a.address] || 0) + 1;
return this[a.address] % 2;
}, Object.create(null));
console.log(result);
关于javascript - 对 JavaScript 数组对象中的项目进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38079037/