基于同级的现有属性将新属性添加到javascript对象中
假设我有一个复杂的对象数组,如下所示:基于同级的现有属性将新属性添加到javascript对象中,javascript,arrays,sorting,lodash,Javascript,Arrays,Sorting,Lodash,假设我有一个复杂的对象数组,如下所示: [ { "title": "Fundamentals", "order": 1, "lessonRef": "fundamentals", "children": [ { "title": "History", "order": 1, "lessonRef": "history", "children": [] }, {
[
{
"title": "Fundamentals",
"order": 1,
"lessonRef": "fundamentals",
"children": [
{
"title": "History",
"order": 1,
"lessonRef": "history",
"children": []
},
{
"title": "NEW NODE 1",
"lessonRef": "NEW NODE 1 STUB",
"children": []
},
{
"title": "Math",
"order": 2,
"lessonRef": "math",
"children": []
},
{
"title": "NEW NODE 2",
"lessonRef": "NEW NODE 2 STUB",
"children": []
}
{
"title": "Geography",
"order": 3,
"lessonRef": "geography",
"children": []
}
]
},
{
"title": "Basics",
"order": 2,
"lessonRef": "basics",
"children": []
}
]
我如何:
新节点
,但没有顺序
字段,并根据其在数组中的位置为其指定下一个编号编辑:提供了我的解决方案——在我的例子中,数组顺序是有保证的,但我将把问题扩展到顺序不保证的情况。如果这是您想要做的:
var yourArray = yourDataArr
var arr1 = []
//fix children first
_.each(yourArray, function(item) {
if(item.children) item.chilren = fixArr(children)
arr1.push(item)
})
//fix your array
yourArray = fixArr(arr1)
//fix function
function fixArr(arr) {
var res = []
var prevOrder
_.each(arr, function(item) {
var currentOrder = item.order
if(!currentOrder) {
item.order = prevOrder?prevOrder + 1:1
prevOrder = item.order + 0
}
res.push(item)
})
return res
}
//or maybe this is you want
function fixArrAlt(arr) {
var res = []
var order = 1
_.each(arr, function(item) {
item.order = order + 0
res.push(item)
order ++
})
return res
}
如果这是你想做的:
var yourArray = yourDataArr
var arr1 = []
//fix children first
_.each(yourArray, function(item) {
if(item.children) item.chilren = fixArr(children)
arr1.push(item)
})
//fix your array
yourArray = fixArr(arr1)
//fix function
function fixArr(arr) {
var res = []
var prevOrder
_.each(arr, function(item) {
var currentOrder = item.order
if(!currentOrder) {
item.order = prevOrder?prevOrder + 1:1
prevOrder = item.order + 0
}
res.push(item)
})
return res
}
//or maybe this is you want
function fixArrAlt(arr) {
var res = []
var order = 1
_.each(arr, function(item) {
item.order = order + 0
res.push(item)
order ++
})
return res
}
按照@jfriend00的建议,我只是递归地映射数组中的所有元素,并将顺序指定为索引:
function reapplyOrder(array){
return _.map(array, function (val, i) {
val.order = i+1;
if(val.children.length > 0){
val.children = reapplyOrder(val.children);
}
return val;
});
}
$scope.array = reapplyOrder($scope.array);
在我的例子中,数组顺序是有保证的,但我将把问题扩展到顺序不保证的情况。根据@jfriend00的建议,我只是递归地映射数组中的所有元素,并将顺序指定为索引:
function reapplyOrder(array){
return _.map(array, function (val, i) {
val.order = i+1;
if(val.children.length > 0){
val.children = reapplyOrder(val.children);
}
return val;
});
}
$scope.array = reapplyOrder($scope.array);
在我的例子中,数组顺序是有保证的,但我将把问题扩展到顺序不保证的情况。听起来您只是想重新分配每个订单号作为其数组位置。您所要做的就是迭代每个数组,并将order属性指定为数组位置。而且,您可以在每个子数组上进行递归。那肯定有用。让我试试。是的,那肯定管用。只是用数组位置做了一个简单的递归函数。我想我会把它放在我的问题中,如果数组顺序不能保证,我会用更新它。谢谢。这个论坛的协议是不要把答案放在你的问题上。如果您发现了一个尚未提供的答案,请将答案放入您自己的答案中(您可以回答自己的问题)。问题应该是问题。答案应该是答案。听起来您只是想重新分配每个订单号作为其数组位置。您所要做的就是迭代每个数组,并将order属性指定为数组位置。而且,您可以在每个子数组上进行递归。那肯定有用。让我试试。是的,那肯定管用。只是用数组位置做了一个简单的递归函数。我想我会把它放在我的问题中,如果数组顺序不能保证,我会用更新它。谢谢。这个论坛的协议是不要把答案放在你的问题上。如果您发现了一个尚未提供的答案,请将答案放入您自己的答案中(您可以回答自己的问题)。问题应该是问题。答案应该是答案。