我有一个JSON数组,其属性为id和parentActivityId。
$scope.data = [
{
id: 1,
activityName: "Drilling",
parentActivityId: 0,
items: [
{
id: 2,
activityName: "Blasting",
parentActivityId: 1,
items: [
{
id: 3,
activityName: "Ann",
parentActivityId: 2,
items: [],
},
{
id: 4,
activityName: "Ann",
parentActivityId: 2,
items: [],
}
]
},
{
id: 5,
activityName: "Transport",
parentActivityId: 1,
items: [
{
id: 6,
activityName: "Daniel",
parentActivityId: 5,
items: [],
}
]
}
]
}
];
我想根据parentActiityId
推送一个新项目。新项目将有一个新的id
。
示例:如果我的对象是这样的:
{
id: 7,
activityName: "Drilling",
parentActivityId: 1,
items: []
}
然后我的对象看起来像这样..
$scope.data = [
{
id: 1,
activityName: "Drilling",
parentActivityId: 0,
items: [
{
id: 2,
activityName: "Blasting",
parentActivityId: 1,
items: [
{
id: 3,
activityName: "Ann",
parentActivityId: 2,
items: [],
},
{
id: 4,
activityName: "Ann",
parentActivityId: 2,
items: [],
},
{
id: 7,
activityName: "Drilling",
parentActivityId: 2,
items: [],
}
]
},
{
id: 5,
activityName: "Transport",
parentActivityId: 1,
items: [
{
id: 6,
activityName: "Daniel",
parentActivityId: 5,
items: [],
}
]
}
]
}
];
我尝试给这个循环..
var arrObj = {
id: 7,
activityName: "Drilling",
parentActivityId: 1,
items: []
};
function populateObj(arrObj) {
for (var i = 0; i < $scope.data.length; i++) {
if ($scope.data[i].id == arrObj.parentActivityId) {
$scope.data.push(arrObj);
}
}
};
populateObj(arrObj);
只会推送到parent。我想在for循环中识别子节点,并通过识别thr parentActivityId.Any帮助来推送到特定的数组对象。将非常感激。
答案 0 :(得分:5)
使用递归提案和Array.prototype.reduce()
:
var data=[{id:1,activityName:"Drilling",parentActivityId:0,items:[{id:2,activityName:"Blasting",parentActivityId:1,items:[{id:3,activityName:"Ann",parentActivityId:2,items:[]},{id:4,activityName:"Ann",parentActivityId:2,items:[]}]},{id:5,activityName:"Transport",parentActivityId:1,items:[{id:6,activityName:"Daniel",parentActivityId:5,items:[]}]}]}],
child = { id: 7, activityName: "Drilling", parentActivityId: 1, items: [] };
function getParent(r, a) {
return a.id === child.parentActivityId ? a : a.items.reduce(getParent, r);
}
var node = data.reduce(getParent, {});
'items' in node && node.items.push(child);
document.write('<pre>' + JSON.stringify(data, 0, 4) + '</pre>');
&#13;
答案 1 :(得分:2)
你接近你想要达到的目标。这应该可以解决问题:
var arrObj = {
id: 7,
activityName: "Drilling",
parentActivityId: 1,
items: []
};
function populateObj(data, arrObj) {
for (var i = 0; i < data.length; i++) {
if (data[i].id == arrObj.parentActivityId) {
data[i].items.push(arrObj);
} else {
populateObj(data[i].items, arrObj);
}
}
};
populateObj(arrObj);
答案 2 :(得分:0)
要检查items数组中的对象,你可以这样做,
var objectList = [
{
id: 1,
activityName: "Drilling",
parentActivityId: 0,
items: [
{
id: 2,
activityName: "Blasting",
parentActivityId: 1,
items: [
{
id: 3,
activityName: "Ann",
parentActivityId: 2,
items: [],
},
{
id: 4,
activityName: "Ann",
parentActivityId: 2,
items: [],
},
{
id: 7,
activityName: "Drilling",
parentActivityId: 2,
items: [],
}
]
},
{
id: 5,
activityName: "Transport",
parentActivityId: 1,
items: [
{
id: 6,
activityName: "Daniel",
parentActivityId: 5,
items: [],
}
]
}
]
}
];
var arrObj = {
id: 7,
activityName: "Drilling",
parentActivityId: 1,
items: []
};
function populateObj(ItemList) {
for (var i = 0; i < ItemList.length; i++) {
if (ItemList[i].id == arrObj.parentActivityId) {
ItemList[i].items.push(arrObj);
}
else
{
populateObj(ItemList[i].items);
}
}
};
populateObj(objectList);