我有一个这样的数组:
var flightPlanCoordinates = [
{lat: 37.772, lng: -122.214, status: 'walking'},
{lat: 36.772, lng: -123.214, status: 'walking'},
{lat: 21.291, lng: -157.821, status: 'automotive'},
{lat: -18.142, lng: 178.431, status: 'automotive'},
{lat: -27.467, lng: 153.027, status: 'walking'}
{lat: -26.467, lng: 151.027, status: 'walking'}
];
我希望将它分成三个数组,这些数组具有相同类型的对象,如下所示:
[{lat: 37.772, lng: -122.214, status: 'walking'},
{lat: 36.772, lng: -123.214, status: 'walking'}]
[{lat: 21.291, lng: -157.821, status: 'automotive'},
{lat: -18.142, lng: 178.431, status: 'automotive'}]
[{lat: -27.467, lng: 153.027, status: 'walking'}
{lat: -26.467, lng: 151.027, status: 'walking'}]
我不能只使用groupBy处理这个,有什么想法吗?
答案 0 :(得分:1)
如果状态正在发生变化,您可以使用Array#reduce()
进行群组更改。
var flightPlanCoordinates = [{ lat: 37.772, lng: -122.214, status: 'walking' }, { lat: 36.772, lng: -123.214, status: 'walking' }, { lat: 21.291, lng: -157.821, status: 'automotive' }, { lat: -18.142, lng: 178.431, status: 'automotive' }, { lat: -27.467, lng: 153.027, status: 'walking' }, { lat: -26.467, lng: 151.027, status: 'walking' }],
grouped = flightPlanCoordinates.reduce(function (r, a, i) {
if (!i || r[r.length - 1][0].status !== a.status) {
return r.concat([[a]]);
}
r[r.length - 1].push(a);
return r;
}, []);
document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');
&#13;
答案 1 :(得分:1)
首先,我们需要创建Nina's Answer中所述的groupBy
函数。然后attach this function to the prototype数组对象,以便它像map和reduce一样全局可用。然后可以使用array.groupBy(key)
访问它。新定义的groupBy
函数也可用于所有其他数组。
var flightPlanCoordinates = [
{ lat: 37.772, lng: -122.214, status: "walking" },
{ lat: 36.772, lng: -123.214, status: "walking" },
{ lat: 21.291, lng: -157.821, status: "automotive" },
{ lat: -18.142, lng: 178.431, status: "automotive" },
{ lat: -27.467, lng: 153.027, status: "walking" },
{ lat: -26.467, lng: 151.027, status: "walking" },
];
Array.prototype.groupBy = function(key) {
return this.reduce(function (r, a, i) {
if (!i || r[r.length - 1][0][key] !== a[key]) {
return r.concat([[a]]);
}
r[r.length - 1].push(a);
return r;
}, []);
};
console.log(flightPlanCoordinates.groupBy("status"))
答案 2 :(得分:0)
在迭代数组中的每个项目时,只需跟踪上次状态(lastStatus
),并将其与当前状态(obj['status']
)进行比较。每次status
更改(lastStatus != obj['status']
)时,都会增加要添加的数组的索引(bucketIndex
),并将数组中的该项(buckets[bucketIndex]
)设置为a新的空数组([]
)。然后,您开始向该数组添加项目(buckets[bucketIndex].push(obj)
),直到状态再次更改,或者您用完要添加的项目。
var flightPlanCoordinates = [
{lat: 37.772, lng: -122.214, status: 'walking'},
{lat: 36.772, lng: -123.214, status: 'walking'},
{lat: 21.291, lng: -157.821, status: 'automotive'},
{lat: -18.142, lng: 178.431, status: 'automotive'},
{lat: -27.467, lng: 153.027, status: 'walking'},
{lat: -26.467, lng: 151.027, status: 'walking'}
];
var buckets = [];
var lastStatus;
var bucketIndex = -1;
flightPlanCoordinates.forEach(function(obj){
if(lastStatus != obj['status']) {
buckets[++ bucketIndex] = [];
}
buckets[bucketIndex].push(obj);
lastStatus = obj['status'];
});
console.log(buckets);
答案 3 :(得分:0)
使用for循环,当当前元素状态与先前元素状态不同时,然后将数组的slice
推入输出数组。
const split = (arr) => {
const output = [];
let last = 0;
for (let i = 1; i <= arr.length; i++) {
if (arr[i]?.status !== arr[i - 1]?.status) {
output.push(arr.slice(last, i));
last = i;
}
}
return output;
};
var flightPlanCoordinates = [
{ lat: 37.772, lng: -122.214, status: "walking" },
{ lat: 36.772, lng: -123.214, status: "walking" },
{ lat: 21.291, lng: -157.821, status: "automotive" },
{ lat: -18.142, lng: 178.431, status: "automotive" },
{ lat: -27.467, lng: 153.027, status: "walking" },
{ lat: -26.467, lng: 151.027, status: "walking" },
];
console.log(split(flightPlanCoordinates));
答案 4 :(得分:0)
我会争辩说,这不是问题,只是要求编写代码...不过
Array.prototype.group_by_sequenced = function (field_name){
var result = new Array();
var j=0;
for (var i=0;i<this.length;i++){
var tmp = this[i];
if (i==0) {
result[j]= new Array();
} else if (this[i-1][field_name]!=this[i][field_name]) {
j++;
result[j] = new Array();
}
result[j].push(tmp);
}
return result;
}
var flightPlanCoordinates = [{ lat: 37.772, lng: -122.214, status: "walking" },{ lat: 36.772, lng: -123.214, status: "walking" },{ lat: 21.291, lng: -157.821, status: "automotive" }, { lat: -18.142, lng: 178.431, status: "automotive" }, { lat: -27.467, lng: 153.027, status: "walking" }, { lat: -26.467, lng: 151.027, status: "walking" }];
var res = flightPlanCoordinates.group_by_sequenced('status');
console.log(res);