0

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>

1
  • There is no JSON in your question. JSON is text that looks like JS objects. You have JS objects. Commented Mar 19, 2019 at 7:37

5 Answers 5

4

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)

Sign up to request clarification or add additional context in comments.

Comments

3

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; }

Comments

2

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)

Comments

1

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; }

Comments

1
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); 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.