I have an array of object with data :
[
{
"id": 1,
"milestone": "Generated",
"phase_id": 1,
"phase": "ICP Assessment",
"activity_id": 1,
"activity": "Data Analysis",
"start_date": "2018-06-12T18:30:00.000Z",
"timeline": "3 weeks",
"responsibility": "2",
"status": "Not Started"
},
{
"id": 1,
"milestone": "Generated",
"phase_id": 1,
"phase": "ICP Assessment",
"activity_id": 2,
"activity": "Territory re-alignment",
"start_date": "2018-06-27T18:30:00.000Z",
"timeline": "2 Weeks",
"responsibility": "2",
"status": "Not Started"
},
{
"id": 2,
"milestone": "Identified",
"phase_id": 2,
"phase": "Pilot Planning",
"activity_id": 3,
"activity": "Existing ICP Discussion",
"start_date": "2018-06-27T18:30:00.000Z",
"timeline": "2 Weeks",
"responsibility": "2",
"status": "Not Started"
}
]
I want to convert this data into something like:
[
{
"id": 1,
"milestone": "Generated",
"phase":[
{
"phase_id": 1,
"phase": "ICP Assessment",
"activity"[
{
"activity_id": 1,
"activity": "Data Analysis",
"start_date": "2018-06-12T18:30:00.000Z",
"timeline": "3 weeks",
"responsibility": "2",
"status": "Not Started"
},
{
"activity_id": 2,
"activity": "Territory re-alignment",
"start_date": "2018-06-27T18:30:00.000Z",
"timeline": "2 Weeks",
"responsibility": "2",
"status": "Not Started"
}
]
}
]
},
{
"id": 2,
"milestone": "Identified",
"phase":[
{
"phase_id": 2,
"phase": "Pilot Planning",
"activity"[
{
"activity_id": 3,
"activity": "Existing ICP Discussion",
"start_date": "2018-06-27T18:30:00.000Z",
"timeline": "2 Weeks",
"responsibility": "2",
"status": "Not Started"
}
]
}
]
}
]
using node.js. just want a simple solution may be using for loop. Any help would be appreciated.
Array reduce method is there to rescue
The flow is as follows. In the array reduce initially pass an empty array in the thisArg.IN the empty array check if there exist an object whose Id is id in the main array.If not then create a new object and push to the empty array
let newData = date.reduce(function (acc, curr) {
//using findIndex to test if there exist an object whose id is same as id of main
//array of objects
let getIdIndex = acc.findIndex(function (item) {
return item.id === curr.id;
})
// if the id does not exist then create a new object with these values
if (getIdIndex === -1) {
let newObj = {
id: curr.id,
milestone: curr.milestone,
phase: [{
phase_id: curr.phase_id,
phase: curr.phase,
activity: [{
activity_id: curr.activity_id,
activity: curr.activity,
start_date: curr.start_date,
timeline: curr.timeline,
responsibility: curr.responsibility,
status: curr.status
}]
}]
}
acc.push(newObj)
}
else{
// now if the id exist you need to check if therse exist an object
// where phase id matches, then same as the above logic
let getPhaseIdIndex = acc[getIdIndex].phase.findIndex(function(item){
return item.phase_id === curr.phase_id;
})
if(getPhaseIdIndex === -1){
acc[getIdIndex].phase.push({
phase_id: curr.phase_id,
phase: curr.phase,
activity: [{
activity_id: curr.activity_id,
activity: curr.activity,
start_date: curr.start_date,
timeline: curr.timeline,
responsibility: curr.responsibility,
status: curr.status
}]
})
}
else{
acc[getIdIndex].phase[getPhaseIdIndex].activity.push(
{
activity_id: curr.activity_id,
activity: curr.activity,
start_date: curr.start_date,
timeline: curr.timeline,
responsibility: curr.responsibility,
status: curr.status
}
)
}
}
return acc;
}, []) // this empty array is thisArg, new values will be added to this
console.log(newData)
Get the full code with working demo here
Related
I have this JSON response where I want to push "status": "pending", inside the nested Menu array, Please help how I can achieve this in Javascript.
[
{
"id": 1,
"status": "pending",
"menues": [
{
"title": "Coke",
"price": "200"
}
]
},
{
"id": 2,
"status": "delivered",
"menues": [
{
"title": "Pepsi",
"price": "120"
}
]
}
]
Here is what I want to achieve:
I just want to push the Staus key/value inside the Menu array
[
{
"id": 1,
"menues": [
{
"title": "Coke",
"price": "200",
"status": "pending",
}
]
},
{
"id": 2,
"menues": [
{
"title": "Pepsi",
"price": "120",
"status": "delivered",
}
]
}
]
You can go over the array, and for each item, go over the items in menues. Using the forEach method, this can even be done as a single statement:
arr = [
{
"id": 1,
"status": "pending",
"menues": [
{
"title": "Coke",
"price": "200"
}
]
},
{
"id": 2,
"status": "delivered",
"menues": [
{
"title": "Pepsi",
"price": "120"
}
]
}
];
arr.forEach(nested => {
nested.menues.forEach(menu => menu.status = nested.status);
delete nested.status
});
console.log(arr);
Maybe this is what you want? The following script creates a new nested array structure, leaving the original unchanged. Instead of deleting the status property from the outer object I limit the creation of properties in the newly created object to id and menues.
I changed this answer in response to OP's comment asking for ES5 and ES6 methods and the ... operator.
arr = [
{
"id": 1,
"status": "pending",
"menues": [
{
"title": "Coke",
"price": "200"
}
]
},
{
"id": 2,
"status": "delivered",
"menues": [
{
"title": "Pepsi",
"price": "120"
}
]
}
];
const res=arr.map(nested =>({ id:nested.id, menues:
nested.menues.map(menu =>({...menu,status:nested.status})) }));
console.log(res);
How can i make the cart_items like my expetation.. just it no more.. my problem just it :D
i just wanna make my cart_items like this.. hope you are can help me thanks. did I make the wrong method? and one more thing, i wanna make the qty inside the cart_items
this is my expectation
"cart": [
{
"id": 1,
"date": "12/10/2020",
"store": {
"id": 1,
"name": "Dirumah Aja",
"promo": 1
},
"cart_items": [
{
"id": 1,
"product": {
"id": 1,
"name": "Bakso Urat",
"price": 10000,
"promo": {
"nama": "promo"
}
},
"qty": 5
}
]
}
]
and this is what I got
"cart": [
{
"cart_items": {
"name": "Steak Sapi Impor",
"price": "38000",
"stock": "4",
"image": "https://firebasestorage.googleapis.com/v0/b/francise-fb70a.appspot.com/o/steak.jpg?alt=media&token=46e0d769-96d3-440f-8edb-5fce2481ace0",
"promo": 3,
"id": 8,
"qty": 1
},
"store": {
"name": "Amanda Foods Store",
"email": "amanda#food.com",
"store_image": "https://firebasestorage.googleapis.com/v0/b/francise-fb70a.appspot.com/o/full_hd_retina.jpeg?alt=media&token=3e602e86-661b-48ee-9e9c-af9f94a170d1",
"product": [
5,
7,
8,
2
],
"store_promo": 1,
"location": {
"street_name": "Jl. Kebon Gedang II B",
"province": "Jawa Barat",
"city": "Bandung",
"post_code": "40285"
},
"id": 1
},
"date_order": "Nov 03 2020 08:48:03",
"id": 2
}
]
This is my data
data() {
return {
promo_id: [],
promo_partner: [],
products: {},
qty: 1,
cart_items: [
{}
]
};
and this is my method
addToCart() {
const date = (new Date()).toString().split(' ').splice(1,4).join(' ')
this.products.cart_items = this.product;
this.products.cart_items.qty = this.qty;
this.products.store = this.partner;
this.products.date_order = date;
console.log(this.cart_items)
axios
.post("http://localhost:3000/cart/", this.products)
.then(() => {
swal("Belanja Berhasil!", {
icon: "success",
});
})
.catch((error) => console.log(error));
}
}
You need to use .push() to add items to an array. You're replacing the array with this.product.
if (!this.products.cart_items) { // initialize cart_items if necessary
this.products.cart_items = [];
}
this.products.cart_items.push({id: this.product.id, product: this.product, qty: this.qty});
I am trying to learn javascript reduce and map an I came across some difficulties.
I have an array with the following format. The id of the parent is same as the location_id of the child. I need to group the array into a nested format.
arr = [
{
"id": 4583211,
"name": "Location 1",
"location_id": null,
},
{
"id": 7458894,
"name": "Location 12",
"location_id": 4583211
},
{
"id": 7463953,
"name": "Location 13",
"location_id": 4583211
},
{
"id": 80302210,
"name": "Location 121",
"location_id": 7458894
},
{
"id": 80302219,
"name": "Location 122",
"location_id": 7458894
},
{
"id": 7464314,
"name": "Location 131",
"location_id": 7463953
},
{
"id": 4583216,
"name": "Location 2",
"location_id": null,
},
{
"id": 3566353,
"name": "Location 21",
"location_id": 4583216
},
]
This array should be grouped as:
result = [
{
"id": 4583211,
"name": "Location 1",
"locations": [
{
"id": 7458894,
"name": "Location 12",
"locations": [
{
"id": 80302210,
"name": "Location 121"
},
{
"id": 80302219,
"name": "Location 122"
}
]
},
{
"id": 7463953,
"name": "Location 13",
"locations": [
{
"id": 7464314,
"name": "Location 131"
}
]
}
]
},
{
"id": 4583216,
"name": "Location 2",
"locations": [
{
"id": 3566353,
"name": "Location 21"
}
]
}
]
I tried to group it using the following method found on SO but it gives different result.
result = arr.reduce(function (r, a) {
r[a.location_id] = r[a.location_id] || [];
r[a.location_id].push(a);
return r;
}, Object.create(null));
You could do this using reduce and recursion you just need to check if parent is equal to current elements location_id.
const data = [{"id":4583211,"name":"Location 1","location_id":null},{"id":7458894,"name":"Location 12","location_id":4583211},{"id":7463953,"name":"Location 13","location_id":4583211},{"id":80302210,"name":"Location 121","location_id":7458894},{"id":80302219,"name":"Location 122","location_id":7458894},{"id":7464314,"name":"Location 131","location_id":7463953},{"id":4583216,"name":"Location 2","location_id":null},{"id":3566353,"name":"Location 21","location_id":4583216}]
function create(data, parent = null) {
return data.reduce((r, e) => {
if(parent == e.location_id) {
const o = { id: e.id, name: e.name }
const children = create(data, e.id);
if(children.length) o.locations = children;
r.push(o)
}
return r
}, [])
}
console.log(create(data))
Below is my Attempt, I have an object which has array of objects within it, it has a field: 'positionTitle'.
I also have an array of objects which also has a 'positionTitle'
They both have similar data I want all of the values for the positionTitles in my 'individualsData' to go into 'graphData' and be able to now use this new graphData!
I think my attempt is wrong its treating them both as arrays?
Thanks, Dale
graphData = {
"engagementAreas": [{
"id": "1",
"engagementTypes": [{
"name": "forestry",
"engagements": []
},
{
"name": "houses",
"engagements": [{
"name": "engagement1",
"members": [{
"position": {
"id": "3434",
"positionTitle": "Manager"
}
}]
}]
}
]
}]
}, {
"name": "landscaping",
"engagements": [{
"name": "engagement1343",
"members": [{
"position": {
"id": "4545",
"positionTitle": "Senior Manager"
}
}]
}]
}
IndividualData = [{
"account": {
"id": "001b000003WnPy1AAF",
"fullName": "Adnan A. Khan"
},
"positions": [{
"id": "a16b0000004AxeBAAS",
"organizationId": "001b0000005gxmlAAA",
"organizationName": "a",
"positionTitle": "Senior Manager, Energy",
"positionLevel": "5-Middle Management & Advisers",
"isPrimary": true,
"startDate": "2016-10-07",
"endDate": null
}]
}, {
"account": {
"id": "0010X000048DDMsQAO",
"fullName": "Christine Leong"
},
"positions": [{
"id": "a160X000004nKfhQAE",
"organizationId": "001b0000005gxmlAAA",
"organizationName": "a",
"positionTitle": "Managing Director",
"positionLevel": "4-Head of Business Unit/Head of Region",
"isPrimary": true,
"startDate": "2018-03-05",
"endDate": null
}]
}
What I expect to see:
NEWgraphData = {
"engagementAreas": [{
"id": "1",
"engagementTypes": [{
"name": "forestry",
"engagements": []
},
{
"name": "houses",
"engagements": [{
"name": "engagement1",
"members": [{
"position": {
"id": "3434",
"positionTitle": "Senior Manager, Energy" <== from individualsdata
}
}]
}]
}
]
}]
}, {
"name": "landscaping",
"engagements": [{
"name": "engagement1343",
"members": [{
"position": {
"id": "4545",
"positionTitle": "Managing Director" <== also from individuals data
}
}]
}]
}
graphData.engagementAreas.map((el, i) => {
el.engagementTypes.engagements.members.position.positionTitle = individualsData.positions.positionTitle;
return el;
})
As engagementTypes, engagements and members properties are also array of objects, you have to loop them as well as below.
graphData.engagementAreas.map((el, i) => {
el.engagementTypes.forEach((et) => {
et.engagements.forEach((eg) => {
eg.members.forEach((mem) => {
mem.position.positionTitle = individualsData.positions.positionTitle; // make sure this is correct
});
});
});
return el;
})
Here is the solution. but you have to choose what individual data item will be the pick for the positionTitle
graphData.engagementAreas.map((el, i) => {
return el.engagementTypes.map((el2,i2) => {
return el2.engagements.map( (el3,i3) => {
return el3.members.map((el4,i4) => {
return el4.position.positionTitle =individualsDt[0].positions.[0].positionTitle;// take a look here, i just pick positionTitle staticly
})
})
})
});
see implementation in console here enter link description here
I want to remove object based on conditional check from the JSON object using angularjs/jQuery.
I tried with below code but output is not as expected.
Demo: https://plnkr.co/edit/EWwbETITqn7G79Xypt0g?p=preview
angular.module('ui.bootstrap.demo').controller('DataCtrl', function ($scope) {
$scope.responseData = {
"data": [{
"name": "Machine", "quantity": 20, "snVal": 22,
"machine1": [{ "id": 2009, "machineName": "ASD1", "trackID": "34219", "status": "delivered" },
{ "id": 27893, "machineName": "PX20AA", "trackID": "3422", "status": "avail" }],
"machine2": [{ "id": 1023, "machineName": "XY22", "trackID": "1345", "status": "avail" },
{ "id": 1233, "machineName": "PP3DF", "trackID": "112", "status": "delivered" }
]
}]
}
console.log("R1 :: " + JSON.stringify($scope.responseData));
$scope.newResponse = $.grep($scope.responseData.data, function (element, index) { return element.status == "delivered" }, true);
console.log("R2 after removing elements:: " + JSON.stringify($scope.newResponse));
});
Try this,
let responseData = { "data": [{ "name": "Machine", "quantity": 20, "snVal": 22, "machine1": [{ "id": 2009, "machineName": "ASD1", "trackID": "34219", "status": "delivered" }, { "id": 27893, "machineName": "PX20AA", "trackID": "3422", "status": "avail" }], "machine2": [{ "id": 1023, "machineName": "XY22", "trackID": "1345", "status": "avail" }, { "id": 1233, "machineName": "PP3DF", "trackID": "112", "status": "delivered" }] }] } ;
let newResponse = responseData;
newResponse.data.forEach(function (item) {
for (j in item) {
if (j.includes("machine")) {
//better you check if type is array, using Object.prototype.toString.call(j) === "[object Array]"
item[j] = item[j].reduce(function (acc, machine) {
if (machine.status !== "delivered"){
acc.push(machine);
}
return acc;
}, []);
}
}
})|
console.log(newResponse);
Here we are just iterating through all objects in the data field. Since properties like machine1, machine2 is an array, we iterate through it and filter all machines which are not delivered.
You must note that I have used a for-in loop and array reduce() method here.