【发布时间】:2014-08-29 13:25:30
【问题描述】:
我有一个可以是任意长度和任意深度的对象数组。我需要能够通过其 id 找到一个对象,然后在数组中修改该对象。有没有一种使用 lodash 或纯 js 的有效方法?
我认为我可以创建一个指向对象的索引数组,但构造表达式以使用这些索引访问对象似乎过于复杂/不必要
编辑1;感谢您的所有回复,我会尝试更具体。我目前正在寻找我试图修改的对象的位置。 parents 是目标对象具有的每个父级的 id 数组。祖先可能是这个数组的更好名称。 costCenters 是包含我要修改的对象的对象数组。此函数递归并返回指向我要修改的对象的索引数组
var findAncestorsIdxs = function(parents, costCenters, startingIdx, parentsIdxs) {
var idx = startingIdx ? startingIdx : 0;
var pidx = parentsIdxs ? parentsIdxs : [];
_.each(costCenters, function(cc, ccIdx) {
if(cc.id === parents[idx]) {
console.log(pidx);
idx = idx + 1;
pidx.push(ccIdx);
console.log(pidx);
pidx = findAncestorsIdx(parents, costCenters[ccIdx].children, idx, pidx);
}
});
return pidx;
};
现在有了这个索引数组,我如何定位和修改我想要的确切对象?我试过这个,祖先是索引数组,costCenters 是包含要修改的对象的数组,parent 是要分配给目标对象的新值
var setParentThroughAncestors = function(ancestors, costCenters, parent) {
var ccs = costCenters;
var depth = ancestors.length;
var ancestor = costCenters[ancestors[0]];
for(i = 1; i < depth; i++) {
ancestor = ancestor.children[ancestors[i]];
}
ancestor = parent;
console.log(ccs);
return ccs;
};
这显然只是返回未修改的 costCenters 数组,所以我能看到的唯一另一种针对该对象的方法是构造像 myObjects[idx1].children[2].grandchildren[3].ggranchildren[4] 这样的表达式。东西=新价值。这是唯一的方法吗?如果是这样,最好的方法是什么?
【问题讨论】:
-
您必须递归地遍历所有对象并与您要查找的 ID 进行比较。
-
你说你有一个对象数组。 JavaScript 中的数组是索引的,而不是关联的,所以大概你的意思是通过索引而不是 ID 来查找对象。否则,请澄清。
-
数组中的每个对象都有一个唯一的 id。我想通过该 id 找到给定的对象,然后更改该对象
-
见Access / process (nested) objects, arrays or JSON。它有一个关于递归的部分。
-
你现在陈述问题的方式预设了一个特定的、尴尬到不可能的解决方案,即将某种“索引”返回到一个对象中,然后可以用来引用物体内部的东西。但是没有这样的动物。您最好设计您的解决方案,以便您传递一个回调,当找到感兴趣的子对象时调用该回调来处理修改。
标签: javascript lodash