仅将重复项从数组推送到新数组(以便它们可以加在一起)
Push only duplicates from array to new array (so they can be added together)
我看过很多关于如何删除重复项的答案,但我需要相反的答案。
我有一个重复的数组。我需要形成一个只有重复项的新数组。然而,重复项是未知的,需要首先发现,因此整个过程是自动化的。
array = [{
"name": "cat",
"amount": 1
}, {
"name": "cat",
"amount": 3
}, {
"name": "cat",
"amount": 2
}, {
"name": "dog",
"amount": 5
}, {
"name": "dog",
"amount": 3
}, {
"name": "dog",
"amount": 2
}, {
"name": "dog",
"amount": 5
}, {
"name": "duck",
"amount": 1
}, {
"name": "duck",
"amount": 4
}]
然后这变得更加复杂,因为每个重复项都需要被推入它自己的数组,而且一个更好的方法是,如果数组中的项目超过 2 个,那么才会这样做。
(这里的最终目标是计算重复项的总数,所以也许有更好的解决方案?)
最终结果应该是这样的:
array1 = [{
"name": "cat",
"amount": 1
}, {
"name": "cat",
"amount": 3
}, {
"name": "cat",
"amount": 2
}]
array2 = [{
"name": "dog",
"amount": 5
}, {
"name": "dog",
"amount": 3
}, {
"name": "dog",
"amount": 2
}, {
"name": "dog",
"amount": 5
}]
但实际的最终结果只是将重复项合计,如此(但如果可以生成以前的数组,我已经可以得到这个):
array = [{
"name": "cat",
"amount": 6
}, {
"name": "dog",
"amount": 15
}]
尝试在 Javascript 或 PHP 中获得此结果。
到目前为止我最接近的是使用 PHP:
将独特的项目放入一个新数组中
function get_duplicates ($array) {
return array_unique( array_diff_assoc( $array, array_unique( $array ) ) );
}
但这只是给出了重复项。
试试这个:
var array = [{
"name": "cat",
"amount": 1
}, {
"name": "cat",
"amount": 3
}, {
"name": "cat",
"amount": 2
}, {
"name": "dog",
"amount": 5
}, {
"name": "dog",
"amount": 3
}, {
"name": "dog",
"amount": 2
}, {
"name": "dog",
"amount": 5
}, {
"name": "duck",
"amount": 1
}, {
"name": "duck",
"amount": 4
}];
var data = {};
for (var elem of array) {
data[elem.name] = data[elem.name] || []
if (data[elem.name]) {
data[elem.name].push(elem);
} else {
data[elem.name] = [elem];
}
}
var result = [];
for (var key in data) {
var amounts = 0;
for (var elem of data[key]) {
amounts += elem.amount;
}
result.push({
name: key,
amount: amounts
});
}
console.log(result);
// [{
// "name": "cat",
// "amount": 6
// }, {
// "name": "dog",
// "amount": 15
// }, {
// "name": "duck",
// "amount": 5
// }]
您可以使用 Map
并获得分组对象的数组数组。
var data = [{ name: "cat", amount: 1 }, { name: "cat", amount: 3 }, { name: "cat", amount: 2 }, { name: "dog", amount: 5 }, { name: "dog", amount: 3 }, { name: "dog", amount: 2 }, { name: "dog", amount: 5 }, { name: "duck", amount: 1 }, { name: "duck", amount: 4 }],
result = Array.from(
data.reduce((m, o) => m.set(o.name, (m.get(o.name) || []).concat(o)), new Map).values()
);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
直接得到最终结果怎么样?如果不存在则推送到新数组,如果已经存在则累积数量
array = [{
"name": "cat",
"amount": 1
}, {
"name": "cat",
"amount": 3
}, {
"name": "cat",
"amount": 2
}, {
"name": "dog",
"amount": 5
}, {
"name": "dog",
"amount": 3
}, {
"name": "dog",
"amount": 2
}, {
"name": "dog",
"amount": 5
}, {
"name": "duck",
"amount": 1
}, {
"name": "duck",
"amount": 4
}];
let res = array.reduce((res, elem) => {
let i = res.filter((e, i) => {
if (e.name === elem.name) {
e.amount += elem.amount
return true
}
return false
})
if (i.length === 0) res.push(elem)
return res
}, [])
console.log(res)
这个怎么样?
肯定可以重构,但你会明白的:)
const dupa = array.reduce((acc, { name, amount }) => {
if (acc[name]) {
return { ...acc, [name]: { amount: acc[name].amount + amount, count: acc[name].count += 1 }};
}
return { ...acc, [name]: { amount, count: 1}};
}, {});
const jaje = Object.keys(dupa)
.filter(key => dupa[key].count > 2)
.map(key => {
return { name: key, amount: dupa[key].amount }
})
console.log(jaje)
这里是工作笔。
https://codepen.io/_papiscript/pen/VGymjL?editors=0010
我看过很多关于如何删除重复项的答案,但我需要相反的答案。 我有一个重复的数组。我需要形成一个只有重复项的新数组。然而,重复项是未知的,需要首先发现,因此整个过程是自动化的。
array = [{
"name": "cat",
"amount": 1
}, {
"name": "cat",
"amount": 3
}, {
"name": "cat",
"amount": 2
}, {
"name": "dog",
"amount": 5
}, {
"name": "dog",
"amount": 3
}, {
"name": "dog",
"amount": 2
}, {
"name": "dog",
"amount": 5
}, {
"name": "duck",
"amount": 1
}, {
"name": "duck",
"amount": 4
}]
然后这变得更加复杂,因为每个重复项都需要被推入它自己的数组,而且一个更好的方法是,如果数组中的项目超过 2 个,那么才会这样做。
(这里的最终目标是计算重复项的总数,所以也许有更好的解决方案?)
最终结果应该是这样的:
array1 = [{
"name": "cat",
"amount": 1
}, {
"name": "cat",
"amount": 3
}, {
"name": "cat",
"amount": 2
}]
array2 = [{
"name": "dog",
"amount": 5
}, {
"name": "dog",
"amount": 3
}, {
"name": "dog",
"amount": 2
}, {
"name": "dog",
"amount": 5
}]
但实际的最终结果只是将重复项合计,如此(但如果可以生成以前的数组,我已经可以得到这个):
array = [{
"name": "cat",
"amount": 6
}, {
"name": "dog",
"amount": 15
}]
尝试在 Javascript 或 PHP 中获得此结果。
到目前为止我最接近的是使用 PHP:
将独特的项目放入一个新数组中function get_duplicates ($array) {
return array_unique( array_diff_assoc( $array, array_unique( $array ) ) );
}
但这只是给出了重复项。
试试这个:
var array = [{
"name": "cat",
"amount": 1
}, {
"name": "cat",
"amount": 3
}, {
"name": "cat",
"amount": 2
}, {
"name": "dog",
"amount": 5
}, {
"name": "dog",
"amount": 3
}, {
"name": "dog",
"amount": 2
}, {
"name": "dog",
"amount": 5
}, {
"name": "duck",
"amount": 1
}, {
"name": "duck",
"amount": 4
}];
var data = {};
for (var elem of array) {
data[elem.name] = data[elem.name] || []
if (data[elem.name]) {
data[elem.name].push(elem);
} else {
data[elem.name] = [elem];
}
}
var result = [];
for (var key in data) {
var amounts = 0;
for (var elem of data[key]) {
amounts += elem.amount;
}
result.push({
name: key,
amount: amounts
});
}
console.log(result);
// [{
// "name": "cat",
// "amount": 6
// }, {
// "name": "dog",
// "amount": 15
// }, {
// "name": "duck",
// "amount": 5
// }]
您可以使用 Map
并获得分组对象的数组数组。
var data = [{ name: "cat", amount: 1 }, { name: "cat", amount: 3 }, { name: "cat", amount: 2 }, { name: "dog", amount: 5 }, { name: "dog", amount: 3 }, { name: "dog", amount: 2 }, { name: "dog", amount: 5 }, { name: "duck", amount: 1 }, { name: "duck", amount: 4 }],
result = Array.from(
data.reduce((m, o) => m.set(o.name, (m.get(o.name) || []).concat(o)), new Map).values()
);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
直接得到最终结果怎么样?如果不存在则推送到新数组,如果已经存在则累积数量
array = [{
"name": "cat",
"amount": 1
}, {
"name": "cat",
"amount": 3
}, {
"name": "cat",
"amount": 2
}, {
"name": "dog",
"amount": 5
}, {
"name": "dog",
"amount": 3
}, {
"name": "dog",
"amount": 2
}, {
"name": "dog",
"amount": 5
}, {
"name": "duck",
"amount": 1
}, {
"name": "duck",
"amount": 4
}];
let res = array.reduce((res, elem) => {
let i = res.filter((e, i) => {
if (e.name === elem.name) {
e.amount += elem.amount
return true
}
return false
})
if (i.length === 0) res.push(elem)
return res
}, [])
console.log(res)
这个怎么样? 肯定可以重构,但你会明白的:)
const dupa = array.reduce((acc, { name, amount }) => {
if (acc[name]) {
return { ...acc, [name]: { amount: acc[name].amount + amount, count: acc[name].count += 1 }};
}
return { ...acc, [name]: { amount, count: 1}};
}, {});
const jaje = Object.keys(dupa)
.filter(key => dupa[key].count > 2)
.map(key => {
return { name: key, amount: dupa[key].amount }
})
console.log(jaje)
这里是工作笔。 https://codepen.io/_papiscript/pen/VGymjL?editors=0010