Javascript 仅将重复项从阵列推送到新阵列(以便可以将它们添加到一起)

Javascript 仅将重复项从阵列推送到新阵列(以便可以将它们添加到一起),javascript,php,arrays,push,Javascript,Php,Arrays,Push,我已经看到了许多关于如何删除重复项的答案,但我需要相反的答案。 我有一个重复的数组。我需要形成一个新的阵列,只有重复的。但是,重复项是未知的,需要首先发现,以便整个过程自动化 array = [{ "name": "cat", "amount": 1 }, { "name": "cat", "amount": 3 }, { "name": "cat", "amount": 2 }, { "name": "do

我已经看到了许多关于如何删除重复项的答案,但我需要相反的答案。 我有一个重复的数组。我需要形成一个新的阵列,只有重复的。但是,重复项是未知的,需要首先发现,以便整个过程自动化

    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
    }]
但实际的最终结果只是将重复项相加,因此(但如果可以生成前面的数组,我已经可以得到这个结果):

尝试在Javascript或PHP中获得此结果

到目前为止,我最接近的方法是使用PHP将唯一项放入新数组:

function get_duplicates ($array) {
    return array_unique( array_diff_assoc( $array, array_unique( $array ) ) );
}
但这只是给出了重复的内容。

试试这个:

var数组=[{
“名称”:“猫”,
“金额”:1
}, {
“名称”:“猫”,
“金额”:3
}, {
“名称”:“猫”,
“金额”:2
}, {
“名称”:“狗”,
“金额”:5
}, {
“名称”:“狗”,
“金额”:3
}, {
“名称”:“狗”,
“金额”:2
}, {
“名称”:“狗”,
“金额”:5
}, {
“名字”:“鸭子”,
“金额”:1
}, {
“名字”:“鸭子”,
“金额”:4
}];
变量数据={};
for(数组的变量元素){
数据[elem.name]=数据[elem.name]| |[]
if(数据[元素名称]){
数据[elem.name].push(elem);
}否则{
数据[elem.name]=[elem];
}
}
var结果=[];
for(var输入数据){
风险价值金额=0;
用于(数据的变量元素[键]){
金额+=要素金额;
}
结果:推({
姓名:key,,
金额:金额
});
}
控制台日志(结果);
// [{
//“名称”:“猫”,
//“金额”:6
// }, {
//“名称”:“狗”,
//“金额”:15
// }, {
//“名字”:“鸭子”,
//“金额”:5
//}]
您可以获取一个数组,并为分组对象获取一个数组

var data=[{name:“cat”,金额:1},{name:“cat”,金额:3},{name:“cat”,金额:2},{name:“dog”,金额:5},{name:“dog”,金额:3},{name:“dog”,金额:2},{name:“dog”,金额:5},{name:“duck”,金额:1},{name:“duck”,金额:4},
结果=Array.from(
data.reduce((m,o)=>m.set(o.name,(m.get(o.name)| |[]).concat(o)),新映射).values()
);
控制台日志(结果)

.as控制台包装{max height:100%!important;top:0;}
直接获取最终结果怎么样?如果不存在,则推送到新阵列;如果已经存在,则累计金额

数组=[{
“名称”:“猫”,
“金额”:1
}, {
“名称”:“猫”,
“金额”:3
}, {
“名称”:“猫”,
“金额”:2
}, {
“名称”:“狗”,
“金额”:5
}, {
“名称”:“狗”,
“金额”:3
}, {
“名称”:“狗”,
“金额”:2
}, {
“名称”:“狗”,
“金额”:5
}, {
“名字”:“鸭子”,
“金额”:1
}, {
“名字”:“鸭子”,
“金额”:4
}];
设res=array.reduce((res,elem)=>{
设i=res.filter((e,i)=>{
if(e.name==元素名){
e、 金额+=要素金额
返回真值
}
返回错误
})
如果(i.length==0)res.push(elem)
返回res
}, [])
console.log(res)
这个怎么样? 当然可以重构,但你会想到:)

这里是工作笔。

请添加您的try。您如何知道
array1
“cat”
相关?我想我的解决方案是从每个数组中获取“name”,并将其放入一个变量,如array1Name。创建一个函数,根据数组长度提取名称。在前面的注释之后,数组可能不是最佳的数据结构,除非解决方案的要求声明需要该数组。感谢您的回复。我刚刚添加了一些细节,重复项未知,需要在代码中找到,因此这是一个自动过程。你的意思是,如果我有元素“fish”,但只有一个,我不会添加它?意思是
elem=>elem.name==“cat”
无法使用,因为名称“cat”未知。你检查结果是否符合预期?太好了!这很有帮助,因为我可以对数组进行计数,以确定重复的数量,然后对每个数组进行数学运算,以合计每个项目的数量。
function get_duplicates ($array) {
    return array_unique( array_diff_assoc( $array, array_unique( $array ) ) );
}
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)