javascript - 压缩数组以对连续元素进行分组
问题描述
下面的代码压缩了一个数组,所以我可以看到一个值在数组中出现了多少次:
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}]
我应该在哪里修改函数,以防止元素不连续时被计入键中?
解决方案
您可以减少值并检查最后一个值是否等于实际值,然后增加最后一个计数或添加一个新对象。
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; }
推荐阅读
- java - 无法在 Android Studio 3.1 上生成签名的 APK
- autodesk-forge - BIM 360 是否有 Field API 的 oAuth 登录?
- python - 需要登录另一个网址后如何将文件发送到网站?
- java - 如何在没有请求和响应对象的情况下从其他服务或 servlet 更新 UI?
- mysql - 统一和简化 MySQL 命令
- javascript - 为什么在有 componentDidUpdate 时使用 getDerivedStateFromProps?
- python - git push azure master azure fatal:不是 git 存储库(或任何父目录):.git
- javascript - 反应语义 ui 渲染调用函数以获取输出
- python - 极差的预测:LSTM 时间序列
- python - 为什么画布出现在 tkinter 的小部件上方?