首页 > 解决方案 > 压缩数组以对连续元素进行分组

问题描述

下面的代码压缩了一个数组,所以我可以看到一个值在数组中出现了多少次:

var str = "shopping-shopping-coupons-shopping-end";
var arr = str.split("-");

function compressArray(original) {
 
	var compressed = [];
	// make a copy of the input array
	var copy = original.slice(0);
 
	// first loop goes over every element
	for (var i = 0; i < original.length; i++) {
 
		var myCount = 0;	
		// loop over every element in the copy and see if it's the same
		for (var w = 0; w < copy.length; w++) {
			if (original[i] == copy[w]) {
				// increase amount of times duplicate is found
				myCount++;
				// sets item to undefined
				delete copy[w];
			}
		}
 
		if (myCount > 0) {
			var a = new Object();
			a.value = original[i];
			a.count = myCount;
			compressed.push(a);
		}
	}
 
	return compressed;
};

console.log(compressArray(arr));

但是,只有当它们连续重复时,我才需要对元素进行分组。因此,我想要的输出应该是:

[{"value": "shopping", "count": 2},
 {"value": "coupons", "count": 1},
 {"value": "shopping", "count": 1},
 {"value": "end", "count": 1}]

我应该在哪里修改函数,以防止元素不连续时被计入键中?

标签: javascriptarrays

解决方案


您可以减少值并检查最后一个值是否等于实际值,然后增加最后一个计数或添加一个新对象。

function compressArray(original) {
    return original.reduce((r, value) => {
        var last = r[r.length - 1];
        if (last && value === last.value) {
            last.count++;
        } else {
            r.push({ value, count: 1 });
        }
        return r;
    }, []);
};

var str = "shopping-shopping-coupons-shopping-end",
    arr = str.split("-");

console.log(compressArray(arr));
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读