Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 合并对象具有数组,并保留数组的两个值_Javascript_Jquery_Arrays - Fatal编程技术网

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
有效!