[英]Merge and nest javascript objects
我有兩個javascript對象,我想更改其中一個的結構並將另一個合並到第一個中
我已經使用循環進行了綁定,但這似乎並不是最好的方法
我的第一個對象稱為“導航欄”
navbar:
[ { Id: 7,
ParentId: null,
Name: 'Home',
Slug: '/',
Priority: 1,
MenuDisplay: true,
MenuSubDisplay: false,
MobileDisplay: false,
PageType: 'Custom Plus' },
{ Id: 15,
ParentId: 14,
Name: 'About Us',
Slug: 'about-us',
Priority: 1,
MenuDisplay: true,
MenuSubDisplay: false,
MobileDisplay: false,
PageType: 'Custom Plus' },
{ Id: 8,
ParentId: null,
Name: 'New Cars',
Slug: 'new-cars',
Priority: 2,
MenuDisplay: true,
MenuSubDisplay: false,
MobileDisplay: false,
PageType: 'Custom' },
{ Id: 14,
ParentId: null,
Name: 'More',
Slug: 'more',
Priority: 8,
MenuDisplay: true,
MenuSubDisplay: false,
MobileDisplay: false,
PageType: 'Placeholder' } ]
我的第二個叫做新車:
newvehicles:
[ { Id: 5,
VehicleType: 'Car',
MakeId: 5,
MakeName: 'Make',
MakeSlug: 'make',
ModelId: 13,
ModelName: 'All-New Car',
ModelSlug: 'all-new-car',
Prefix: null,
Suffix: null,
Priority: 1,
Redirect: null,
Image:
'http://xxxx.jpg',
Assets: null,
Markup: null },
{ Id: 6,
VehicleType: 'Car',
MakeId: 5,
MakeName: 'Car',
MakeSlug: 'Car',
ModelId: 8,
ModelName: 'Car',
ModelSlug: 'Car',
Prefix: null,
Suffix: null,
Priority: 2,
Redirect: null,
Image:
'http://xxxx.jpg',
Assets: null,
Markup: null } ]
我要實現的目標是將新車的對象作為“新車”的子項推入導航欄,並通過導航欄移動任何具有不為null的ParentId的東西移動到該父對象中作為一個孩子
我目前正在使用for循環進行一些更改:
for (var i = 0; i < navigation.navbar.length; i++) {
var obj = navigation.navbar[i];
if (obj.Slug == 'new-cars') {
obj.child = newvehicles;
}
}
但是我正在尋找這樣的輸出:
navbar:
[ { Id: 7,
ParentId: null,
Name: 'Home',
Slug: '/',
Priority: 1,
MenuDisplay: true,
MenuSubDisplay: false,
MobileDisplay: false,
PageType: 'Custom Plus' },
{ Id: 8,
ParentId: null,
Name: 'New Cars',
Slug: 'new-cars',
Priority: 2,
MenuDisplay: true,
MenuSubDisplay: false,
MobileDisplay: false,
PageType: 'Custom'.
child : [ { Id: 5,
VehicleType: 'Car',
MakeId: 5,
MakeName: 'Make',
MakeSlug: 'make',
ModelId: 13,
ModelName: 'All-New Car',
ModelSlug: 'all-new-car',
Prefix: null,
Suffix: null,
Priority: 1,
Redirect: null,
Image:
'http://xxxx.jpg',
Assets: null,
Markup: null },
{ Id: 6,
VehicleType: 'Car',
MakeId: 5,
MakeName: 'Car',
MakeSlug: 'Car',
ModelId: 8,
ModelName: 'Car',
ModelSlug: 'Car',
Prefix: null,
Suffix: null,
Priority: 2,
Redirect: null,
Image:
'http://xxxx.jpg',
Assets: null,
Markup: null } ] },
{ Id: 14,
ParentId: null,
Name: 'More',
Slug: 'more',
Priority: 8,
MenuDisplay: true,
MenuSubDisplay: false,
MobileDisplay: false,
PageType: 'Placeholder',
child: { Id: 15,
ParentId: 14,
Name: 'About Us',
Slug: 'about-us',
Priority: 1,
MenuDisplay: true,
MenuSubDisplay: false,
MobileDisplay: false,
PageType: 'Custom Plus' } } ]
您提出的循環邏輯似乎已經滿足您關於追加汽車邏輯的目標。 但是,您的要求中隱含的是只有一個條目帶有“新車”的標簽。 如果是這樣,請考慮:
navbar.find(item => item.Slug == 'new-cars').child = newvehicles;
關於非null parentId,您可以:
這是代碼:
for (var i = navbar.length - 1; i >= 0; i--) {
var obj = navbar[i];
let parent = navbar.find(item => item.Id == obj.ParentId);
if (parent) {
parent.child = navbar.splice(i,1);
}
}
在這兩種情況下,都將前綴“導航”。 必要時轉到“導航欄”和/或“新車”。
編輯:要處理OP的以下注釋,要求能夠將多個子級與父級關聯。
為了讓'child'屬性允許多個孩子,我們將其變成一個數組。 因此,我們將首先檢查父級中是否存在'child'屬性。 如果沒有,我們將其創建並將其設置為一個空數組。 然后,將拼接的子對象推入循環:
for (var i = navbar.length - 1; i >= 0; i--) {
var obj = navbar[i];
let parent = navbar.find(item => item.Id == obj.ParentId);
if (parent) {
if (!parent.child)
parent.child = [];
parent.child.push(navbar.splice(i,1)[0]);
}
}
考慮根據需要將“孩子”的名稱更改為“孩子”。
另外,請注意,所有這些操作僅適用於一個級別。 如果您需要父母對孩子的多層嵌套,那么簡單的循環是不夠的。 在這種情況下,您可能想創建一個不同的問題。
這是基於Lodash-fp的解決方案
這是Lodash庫的一種變體,它允許使用完整的函數式編程樣式,並使此類任務非常容易(如果您需要一些解釋,請不要猶豫)
const parentsPartition = _.partition(['ParentId', null], navbar);
const vehicleHierarchy = _.map(
vehicle => {
const children = _.filter(['ParentId', vehicle.Id], parentsPartition[1]);
return _.cond([
[_.isEmpty, _.constant(vehicle)],
[_.stubTrue, _.set('children', _, vehicle)]
])(children);
},
_.concat(parentsPartition[0], newvehicles)
);
這就是結果(對不起,我的屏幕不夠高,無法完整打印)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.