我有一个对象数组,长度和深度均可变。我需要通过其id查找并修改该对象在数组中的位置。使用lodash或纯js是否有有效的方法来实现这一点?
我曾尝试创建一个索引数组,以便访问目标对象,但是构造表达式来访问这些索引所对应的对象似乎过于复杂/不必要。
编辑1:感谢所有回复。我将尝试更加具体地说明问题。我正在通过以下方式查找要修改的对象位置。parents是每个父对象的id数组,祖先可能是这个数组的更好名称。costCenters是包含我想要修改的对象的对象数组。此函数递归并返回一个导致我想要修改的对象的索引数组。
现在有了这个索引数组,我该如何定位和修改我想要的确切对象?我尝试过使用ancestors作为索引数组,costCenters作为包含要被修改对象的数组,并将parent作为新值分配给目标对象。
我曾尝试创建一个索引数组,以便访问目标对象,但是构造表达式来访问这些索引所对应的对象似乎过于复杂/不必要。
编辑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;
};
现在有了这个索引数组,我该如何定位和修改我想要的确切对象?我尝试过使用ancestors作为索引数组,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].something = newValue的表达式。这是唯一的方法吗?如果是,那么最好的方法是什么?
if (obj.id === idToFind) { obj.prop = newValue; }
- Felix Kling