这是我的代码:
function createMatchList(data) {
var matchArray = [];
for (var i = 0; i < initialData.length; i++) {
var listData = cleanData(initialData[i][data]);
if (matchArray.length) {
for (var a = 0; a < matchArray.length; a++) {
if (matchArray[a][data] == listData) {
matchArray[a].Count = matchArray[a].Count + 1;
} else {
// THIS CAUSES LOOP
matchArray.push({ [data]: listData, "Count": 1 });
}
}
} else {
matchArray.push({ [data]: listData, "Count": 1 });
}
}
}
从本质上讲,这似乎在找不到匹配对象时起作用,我有一个else
将该对象推入数组,这会导致循环。
我不确定为什么会发生这种情况,我完全迷失了。
我有一个初始if/else
,以查看数组是否为空,如果为空,则将初始对象推入数组,如果数组不为空,则越过这一点,我使用for循环和if
语句有效,但是我的else语句导致循环。如果我将matchArray.push({ [data]: listData, "Count": 1 });
从else语句中取出并仅进行console.log记录,它将成功记录initialData
的第一个for循环中的每个其他迭代。
只是为了了解其中带有对象的数组的样子:
[
{
Date: "27 June 1911",
Count: 1
}
]
我的目标是在数组中搜索匹配的日期,如果有匹配项,请不要推送到数组,而要更新计数。原因是我有一个巨大的原始JSON文件,其中包含重复项,并且我正在尝试创建一个新的数据源,以删除重复项并计算发生的次数。
谢谢
答案 0 :(得分:1)
性能有多重要,您是否使用> = 2015?如果是这样,您可以改为映射并减少一些代码复杂性,例如this答案:
const counts = new Map([...new Set(a)].map(
x => [x, a.filter(y => y === x).length]
));
然后获取您将要拨打的电话数:
counts.get(x)
在需要将其存储在与上面概述的对象完全一样的情况下,我会做类似的事情:
let unique = Set(dates);
var matchArray = [];
unique.forEach(function (date) {
matchArray.push({
"Date": date,
"Count": dates.filter(x => x === date).length
});
});
答案 1 :(得分:1)
[...new Set(dates)].map(date => ({
date,
count: dates.filter(currDate => date === currDate).length
}));
注意:按照惯例,对象键应小写,date
而不是Date
。
或者,如果您感到勇敢:
const counts = {};
dates.forEach(date => (counts[date] = (counts[date] || 0) + 1));
const dates = [
'27 June 1911',
'27 June 1952',
'27 March 1911',
'27 June 1952',
'24 June 1911',
'27 June 1952'
];
const datesCount = [...new Set(dates)].map(date => ({
date,
count: dates.filter(currDate => date === currDate).length
}));
console.log('datesCount', datesCount);
const counts = {};
dates.forEach(date => (counts[date] = (counts[date] || 0) + 1));
const dateCount2 = Object.entries(counts).map(([date, count]) => ({
date,
count
}));
console.log('dateCount2', dateCount2);
// Make unique array of dates.
const datesSet = [...new Set(dates)];
// Count by filtering the array and getting it's length.
const datesCount = datesSet.map(date => ({
date,
count: dates.filter(currDate => date === currDate).length
}));