首先,您拥有的是一个对象数组。数组是原生 JS 对象(实际上是Object 的增强实例)。 JS 中没有 JSON 对象 这样的东西,因为 JSON 是 JavaScript Object Notation 的首字母缩写。
它是一种经常用于传输数据的格式,但格式良好的 JSON 是格式良好的 JS 文字表示法。如此之多,以至于您可以只 eval 一个 JSON 字符串,但 无论您做什么,都不要。 More details can be found here
尽管如此,你得到的任何解决方案都将是 JavaScript 解决方案,因为 jQ 就是 JavaScript……你在 JS 中所做的一切都在 jQ 中工作,你编写的每条涉及 jQ 的语句都会评估一系列函数调用和构成 jQ 工具包的其他魔法,无论如何,所有这些都是用普通的 'ol VanillaJS 编写的。
但是,回到你的问题。看看你的结构,我想我说每个 children 属性都是一个数组,包含对象,(可能)有一个 page 属性。该属性将有一个分配给它的对象。这些都是我的假设,但我的印象是这里就是这种情况。这意味着,要扩展这个对象,一个简单的 map-callback-function 就足够了:
yourArray = yourArray.map(function ext(obj)
{//named callback function, does not pollute global scope
obj.title = "title";
obj.score = 5.3;
if (obj.children instanceOf Array)
{//recursively apply callback
obj.children = obj.children.map(ext);//reference to current callback function
}
return obj;//return altered object
});
这会映射每个数组,为对象分配属性,然后检查是否有 children 属性,这也是一个数组,并应用相同的回调函数来映射该数组,从而将此映射呈现为递归映射.
因为我们在这里处理对象,return obj 语句实际上是可选的,因为对象是引用:
yourArray.map(function ext(obj)
{//no assignment
obj.title = "title";
obj.score = 5.3;
if (obj.children instanceOf Array)
{
obj.children = obj.children.map(ext);
}
});
同样有效
使用 jQuery 的 extend 方法,您可以稍微缩短这段代码,但不会缩短很多(实际上是 1 行),当然:
yourArray = yourArray.map(function ext(obj)
{
$.extend(obj, {title: 'title',score: 5.3});
if (obj.children instanceOf Array)
{
obj.children = obj.children.map(ext);
}
return obj;
});
或者,更jQ的味道:
$.each(yourArray, function ext(i, obj)
{
$.extend(obj, {title: 'title', score: 5.3});
if (obj.children instanceof Array)
{
$.each(obj.children(ext));
}
});
但正如您所见,就可读性和代码紧凑性而言,差异很小。说实话,jQ 在这里所做的一切真的是让你慢下来。
因为$.extend 需要一个对象作为第二个参数,所以我必须在每次调用回调时构造一个对象字面量。我不能使用分配给位于更高范围内的变量的对象,因为如前所述:永远不会复制对象,只有对它们的引用。使用更高范围的变量会使代码更容易出错:
var extendObj = {title: 'title', score: 4};
yourArray = yourArray.map(function ext(obj)
{
$.extend(obj, extendObj);
if (obj.children instanceOf Array)
{
obj.children = obj.children.map(ext);
}
return obj;
});
这会很完美,但是:
var extendObj = {title: 'title', score: 4, deep:{another: 'object'}};
需要深度克隆:
$.extend(true, obj, extendObj);
如果您忘记/忽略这一点,通过一个实例更改 deep 的属性,将意味着所有其他实例也反映相同的更改...不理想