将javascript中的对象数组拆分为基于属性的单独数组

时间:2016-04-13 04:37:39

标签: javascript arrays split

我有一个这样的数组:

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处理这个,有什么想法吗?

5 个答案:

答案 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;
&#13;
&#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);