Javascript 合并对象具有数组,并保留数组的两个值
我有两个对象,通过使用Javascript 合并对象具有数组,并保留数组的两个值,javascript,jquery,arrays,Javascript,Jquery,Arrays,我有两个对象,通过使用jQuery.extend函数将它们组合起来 john_5_years_ago = { name: "john", company: "google", languages: ["c++", "java"] } john_now = { name: "john", company: "facebook", nation: "US", languages: ["python", "java", "javascript"
jQuery.extend
函数将它们组合起来
john_5_years_ago = {
name: "john",
company: "google",
languages: ["c++", "java"]
}
john_now = {
name: "john",
company: "facebook",
nation: "US",
languages: ["python", "java", "javascript"]
}
$.extend(true, {}, john_5_years_ago, john_now)
它返回如下结果:
{
name: "john",
company: "facebook",
nation: "US",
languages: ["python", "java", "javascript"]
}
{
name: "john",
company: "facebook",
nation: "US",
languages: ["python", "java", "javascript", "c++"]
}
但是我希望语言数组的值应该被合并,而不是被覆盖。预期的结果应该是这样的:
{
name: "john",
company: "facebook",
nation: "US",
languages: ["python", "java", "javascript"]
}
{
name: "john",
company: "facebook",
nation: "US",
languages: ["python", "java", "javascript", "c++"]
}
我会很感激你的任何想法 您可以用简单的JS编写:
var old={
姓名:“约翰”,
公司:“谷歌”,
语言:[“c++”,“java”]
}
var now={
姓名:“约翰”,
公司:“facebook”,
国家:“美国”,
语言:[“python”、“java”、“javascript”]
}
Object.keys(旧).forEach(函数(prop){
如果(现在[prop]!=未定义){
if(现在[“语言”]数组实例和旧的[prop]数组实例){
旧[prop].forEach(函数(项){
如果(现在[prop].indexOf(项目)=-1){
现在[道具].推(物品);
}
});
}
}否则{
现在的[道具]=旧的[道具];
}
});
console.log(现在)代码>给你一个解决方案
var john_5年前={
姓名:“约翰”,
公司:“谷歌”,
语言:[“c++”,“java”]
}
var john_now={
姓名:“约翰”,
公司:“facebook”,
国家:“美国”,
语言:[“python”、“java”、“javascript”]
}
$。每个(john_now,函数(i,键){
如果(i==‘语言’){
$。每个(john_5年前[i],函数(j){
if(john_now[i].indexOf(john_5年前[i][j])==-1)
john_now[i].push(john_5年前[i][j])
});
}
});
console.log(john_now)代码>
试试这个:
单击按钮以连接两个阵列
试试看
函数myFunction(){
约翰5年前={
姓名:“约翰”,
公司:“谷歌”,
语言:[“c++”,“java”]
}
约翰现在={
姓名:“约翰”,
公司:“facebook”,
国家:“美国”,
语言:[“python”、“java”、“javascript”]
}
var children=$.extend(true,{},john_5年前,john_现在);
console.log(子级)
children=merge_数组(children.languages,john_5年前的语言);
document.getElementById(“demo”).innerHTML=children;
}
函数合并_数组(array1,array2){
var结果_数组=[];
var arr=阵列1.concat(阵列2);
var len=阵列长度;
var assoc={};
而(len--){
var项目=arr[len];
如果(!关联[项目])
{
结果_数组。取消移位(项);
关联[项目]=真;
}
}
返回结果_数组;
}
jQuery.extend()
将合并对象,deep也将工作。但是,在合并数组时,的大小不会改变,也不会找到不同的值。它将替换索引中的那些值,这就是它所做的(我已经包括了下面描述的演示)
有关更多详细信息,请参阅以及
因此,此函数不会为您的案例提供解决方案,您应该编写一个自定义函数(如“我的解决方案”部分)
要在输出中存储深度合并的结果,您应该在第二个参数中指定它,如$.extend(true,john_now,john_5年前)代码>
var john_5年前={
姓名:“约翰”,
公司:“谷歌”,
语言:[“c++”、“javascript”、“c”],
额外:{
aExtra:“aExtra1值”,
bExtra:“bExtra1值”,
cExtra:“cExtra1值”
}
}
var john_now={
姓名:“约翰”,
公司:“facebook”,
国家:“美国”,
语言:[“python”、“java”、“c”、“javascript”],
额外:{
aExtra:“aExtra2值”,
cExtra:“cExtra2值”,
zExtra:“zExtra2值”
}
}
$.extend(没错,现在是john_,5年前是john_);
console.log(john_now)代码>
谢谢,你的解释给了我一个线索。我找到了另一个解决方案,有点棘手。我通过在第243行之后添加copy=uuu.union(src,copy)
来重新实现函数jQuery.extend
。就是这样,jQuery.extend
有效!