Reputation: 645
I have this object as define below:
var object = {
"driver_data": [{
"slot": 0,
"rideCount":98
}, {
"slot": 30,
"rideCount": 75
}, {
"slot": 100,
"rideCount": 0
}],
"passenger_data": [{
"slot": 0,
"rideCount":33
}, {
"slot": 30,
"rideCount": 56
}, {
"slot": 100,
"rideCount": 37
}]
}
want to convert like :
[{"Slot":0,"passenger_data":98,"driver_data":33},
{"Slot":30,"passenger_data":75,"driver_data":56},
{"Slot":100,"passenger_data":0,"driver_data":37}
]
I tried this but wont work.
var slot1 = [],
Dride = [],
Pride = [];
var object = {
"driver_data": [{
"slot": 0,
"rideCount": 98
}, {
"slot": 30,
"rideCount": 75
}, {
"slot": 100,
"rideCount": 0
}],
"passenger_data": [{
"slot": 0,
"rideCount": 33
}, {
"slot": 30,
"rideCount": 56
}, {
"slot": 100,
"rideCount": 37
}]
}
object.driver_data.forEach(function(key) {
slot1.push(key.slot);
Pride.push(key.rideCount)
});
object.passenger_data.forEach(function(key) {
Dride.push(key.rideCount);
});
var myObj = {},
myObj1 = {},
myObj2 = {},
monk=['Slot','passenger_data','driver_data'];
var arr = [];
for(var i=0;i<3;i++){
myObj[monk[i]] = slot1[i];
myObj1[monk[i]] = Pride[i];
myObj2[monk[i]] = Dride[i];
}
arr.push(myObj, myObj1, myObj2)
console.log(JSON.stringify(arr))
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Upvotes: 0
Views: 90
Reputation: 35222
Assuming the slots
are in the same order for driver_data
and passenger_data
, you could map
over the driver_data
like this:
var obj = {"driver_data":[{"slot":0,"rideCount":98},{"slot":30,"rideCount":75},{"slot":100,"rideCount":0}],"passenger_data":[{"slot":0,"rideCount":33},{"slot":30,"rideCount":56},{"slot":100,"rideCount":37}]}
let output = obj.driver_data.map((d, index) => ({
Slot: slot,
driver_data: d.rideCount,
passenger_data: obj.passenger_data[index].rideCount
}))
console.log(output)
If the slots
are not in the same order, you can use map
and find
like this. Get the passenger with the same slot
as the driver. Return a new object with count values
var obj={"driver_data":[{"slot":0,"rideCount":98},{"slot":30,"rideCount":75},{"slot":100,"rideCount":0}],"passenger_data":[{"slot":0,"rideCount":33},{"slot":30,"rideCount":56},{"slot":100,"rideCount":37}]}
let output = obj.driver_data.map(d => {
let passenger = obj.passenger_data.find(p => p.slot === d.slot);
return {
Slot: d.slot,
driver_data: d.rideCount,
passenger_data: (passenger || {}).rideCount
}
})
console.log(output)
Or using Array.from
(Assumes the slot
are in order)
var obj={"driver_data":[{"slot":0,"rideCount":98},{"slot":30,"rideCount":75},{"slot":100,"rideCount":0}],"passenger_data":[{"slot":0,"rideCount":33},{"slot":30,"rideCount":56},{"slot":100,"rideCount":37}]}
let { driver_data, passenger_data } = obj;
const output = Array.from({ length: driver_data.length }, (_, i) => {
return {
Slot: driver_data[i].slot,
driver_data: driver_data[i].rideCount,
passenger_data: passenger_data[i].rideCount
}
})
console.log(output)
Upvotes: 4
Reputation: 3122
Rather Using find better create a Map or object first from any of the two data as searching on Map or Object have O(1) complexity.
var object = {
"driver_data": [{
"slot": 0,
"rideCount":98
}, {
"slot": 30,
"rideCount": 75
}, {
"slot": 100,
"rideCount": 0
}],
"passenger_data": [{
"slot": 0,
"rideCount":33
}, {
"slot": 30,
"rideCount": 56
}, {
"slot": 100,
"rideCount": 37
}]
}
let data = object.driver_data.reduce((acc, curr) => {
acc[curr.slot] = curr.rideCount;
return acc;
}, {});
let out = object.passenger_data.map(({slot, rideCount}) => ({slot, passenger_data: rideCount, driver_data: data[slot]}));
console.log(out)
Upvotes: 2
Reputation: 2866
var object = {
"driver_data": [{
"slot": 0,
"rideCount":98
}, {
"slot": 30,
"rideCount": 75
}, {
"slot": 100,
"rideCount": 0
}],
"passenger_data": [{
"slot": 0,
"rideCount":33
}, {
"slot": 30,
"rideCount": 56
}, {
"slot": 100,
"rideCount": 37
}]
}
var driver_data = object.driver_data;
var passenger_data = object.passenger_data;
var result = [];
for(var i=0;i<driver_data.length;i++){
result.push({Slot:driver_data[i].slot,passenger_data:driver_data[i].rideCount,driver_data:passenger_data[i].rideCount});
}
console.log(result);
Upvotes: 1
Reputation: 386570
You could take a Map
with slot
as key and collect the wanted properties.
var data = { driver_data: [{ slot: 0, rideCount: 98 }, { slot: 30, rideCount: 75 }, { slot: 100, rideCount: 0 }], passenger_data: [{ slot: 0, rideCount: 33 }, { slot: 30, rideCount: 56 }, { slot: 100, rideCount: 37 }] },
result = Array.from(['driver_data', 'passenger_data']
.reduce(
(m, key) => data[key].reduce(
(n, { slot, rideCount }) => n.set(slot, Object.assign(
{ slot },
n.get(slot),
{ [key]: rideCount }
)),
m
),
new Map
)
.values()
);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Upvotes: 3
Reputation: 44107
You can use map
like so:
var object = {"driver_data": [{"slot": 0,"rideCount": 98}, {"slot": 30,"rideCount": 75}, {"slot": 100,"rideCount": 0}],"passenger_data": [{"slot": 0,"rideCount": 33}, {"slot": 30,"rideCount": 56}, {"slot": 100,"rideCount": 37}]};
var newObject = object.driver_data.map(driver => {
var passenger = object.passenger_data.find(({ slot }) => slot == driver.slot);
return {
slot: driver.slot,
passenger_data: passenger.rideCount,
driver_data: driver.rideCount
}
});
console.log(newObject);
.as-console-wrapper { max-height: 100% !important; top: auto; }
Upvotes: 1