将JavaScript中的对象数组根据属性拆分为多个单独的数组

5

我有一个这样的数组:

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来处理这个问题,你有任何想法吗?

1
你为什么在这个@geekymano上设置赏金?Nina Scholz的回答有什么问题吗? - Daniele Ricci
5个回答

5

如果状态发生改变,您可以使用 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>');


1
使用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));


1

首先,我们需要创建一个groupBy函数,就像Nina's Answer中所描述的那样。然后将此函数附加到数组对象的原型上,这样它就可以像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"))


0

@TheChetan的答案在我看来远非理想,当初始数组中元素的顺序不是一个良好的顺序时,它的效果并不好(除非这是期望的行为,但我怀疑)。

以下是我的解决方案:

export const groupArrayByElementKey = (arr = [], key) => {
    if (!arr.some(el => key in el)) {
        return arr;
    }

    return arr.reduce((acc, curr) => {
        const existingGroupIndex = acc.findIndex(el => el[0][key] === curr[key]);

        if (!acc[existingGroupIndex]) {
            return acc.concat([[curr]]);
        } else {
            acc[existingGroupIndex].push(curr);
        }

        return acc;
    }, []);
};

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


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