Javascript 为什么jQueryExtend不能递归地复制这两个对象文本?

Javascript 为什么jQueryExtend不能递归地复制这两个对象文本?,javascript,jquery,web,extend,Javascript,Jquery,Web,Extend,我正在使用jQuery$.extend方法对两个对象进行递归合并,但它并没有像我预期的那样工作。(旁白:这些对象文字采用CKEditor配置其工具栏所需的格式。) 预期结果:最大化、显示块和源 实际结果:最大化显示块 var obj1 = [ { name: 'styles', items: ['Format', 'Font', 'FontSize'] }, { name: 'colors', items: ['TextColor', 'BGColor'] }, { na

我正在使用jQuery$.extend方法对两个对象进行递归合并,但它并没有像我预期的那样工作。(旁白:这些对象文字采用CKEditor配置其工具栏所需的格式。)

预期结果:最大化、显示块和源

实际结果:最大化显示块

var obj1 = [
    { name: 'styles', items: ['Format', 'Font', 'FontSize'] },
    { name: 'colors', items: ['TextColor', 'BGColor'] },
    { name: 'tools', items: ['Maximize', 'ShowBlocks'] },
];
var obj2 = [
    { name: 'tools', items: ['Source'] }
];

var recursiveFail = $.extend(true, {}, obj1, obj2);

// Test result here....
alert(recursiveFail[2].items);

问题:为什么没有添加“源”选项?

$.extend
不是这样工作的:它会将对象的属性从一个对象复制到另一个对象。它无法识别诸如“我看到这个数组的这些对象中的‘name’是相同的,所以我知道合并‘items’数组。”

您可能需要编写自己的循环,以使用
obj2
来扩充
obj1

// Add 'Source' command to the tools group
for (var i = 0; i < obj1.length; i++) {
    if (obj1[i].name === 'tools') {
        obj1[i].items.push('Source');
        break;
    }
}
//将“Source”命令添加到工具组
对于(变量i=0;i
$.extend
不是这样工作的:它将对象的属性从一个对象复制到另一个对象。它无法识别诸如“我看到这个数组的这些对象中的‘name’是相同的,所以我知道合并‘items’数组。”

您可能需要编写自己的循环,以使用
obj2
来扩充
obj1

// Add 'Source' command to the tools group
for (var i = 0; i < obj1.length; i++) {
    if (obj1[i].name === 'tools') {
        obj1[i].items.push('Source');
        break;
    }
}
//将“Source”命令添加到工具组
对于(变量i=0;i
$.extend
不是这样工作的:它将对象的属性从一个对象复制到另一个对象。它无法识别诸如“我看到这个数组的这些对象中的‘name’是相同的,所以我知道合并‘items’数组。”

您可能需要编写自己的循环,以使用
obj2
来扩充
obj1

// Add 'Source' command to the tools group
for (var i = 0; i < obj1.length; i++) {
    if (obj1[i].name === 'tools') {
        obj1[i].items.push('Source');
        break;
    }
}
//将“Source”命令添加到工具组
对于(变量i=0;i
$.extend
不是这样工作的:它将对象的属性从一个对象复制到另一个对象。它无法识别诸如“我看到这个数组的这些对象中的‘name’是相同的,所以我知道合并‘items’数组。”

您可能需要编写自己的循环,以使用
obj2
来扩充
obj1

// Add 'Source' command to the tools group
for (var i = 0; i < obj1.length; i++) {
    if (obj1[i].name === 'tools') {
        obj1[i].items.push('Source');
        break;
    }
}
//将“Source”命令添加到工具组
对于(变量i=0;i
$。extend
不打算以这种方式使用

但是,您可以编写自己的扩展/合并函数。下面是一个函数示例,该函数将从多个提供的数组中合并所有被认为相等的对象(基于特定键的值)

以下合并算法将覆盖基元值并连接数组。 初始数组及其对象不会被修改

如果你只需要做一次,这可能会有点过头,不过这是一个如何实现你自己的封装合并算法的例子


$.extend
不应以这种方式使用

但是,您可以编写自己的扩展/合并函数。下面是一个函数示例,该函数将从多个提供的数组中合并所有被认为相等的对象(基于特定键的值)

以下合并算法将覆盖基元值并连接数组。 初始数组及其对象不会被修改

如果你只需要做一次,这可能会有点过头,不过这是一个如何实现你自己的封装合并算法的例子


$.extend
不应以这种方式使用

但是,您可以编写自己的扩展/合并函数。下面是一个函数示例,该函数将从多个提供的数组中合并所有被认为相等的对象(基于特定键的值)

以下合并算法将覆盖基元值并连接数组。 初始数组及其对象不会被修改

如果你只需要做一次,这可能会有点过头,不过这是一个如何实现你自己的封装合并算法的例子


$.extend
不应以这种方式使用

但是,您可以编写自己的扩展/合并函数。下面是一个函数示例,该函数将从多个提供的数组中合并所有被认为相等的对象(基于特定键的值)

以下合并算法将覆盖基元值并连接数组。 初始数组及其对象不会被修改

如果你只需要做一次,这可能会有点过头,不过这是一个如何实现你自己的封装合并算法的例子


您可以从中使用合并方法。检查此答案:


您可以从中使用合并方法。检查此答案:


您可以从中使用合并方法。检查此答案:


您可以从中使用合并方法。检查此答案: