объединить два объекта данных JSON в один, JSON в новый Single JSON, - PullRequest
0 голосов
/ 19 марта 2019

У меня есть этот объект, как определено ниже:

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

хочу конвертировать как:

[{"Slot":0,"passenger_data":98,"driver_data":33},
 {"Slot":30,"passenger_data":75,"driver_data":56},
 {"Slot":100,"passenger_data":0,"driver_data":37}
]

Я пробовал это, но не получится.

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>

Ответы [ 5 ]

4 голосов
/ 19 марта 2019

Предполагая, что slots в том же порядке для driver_data и passenger_data, вы можете map вместо driver_data, например:

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)

Если slots не в том же порядке, вы можете использовать map и find, как это.Получите пассажира с тем же slot, что и у водителя .Вернуть новый объект со значениями счетчика

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)

Или используя Array.from (Предполагается, что slot в порядке)

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)
3 голосов
/ 19 марта 2019

Вы можете взять Map с ключом slot и получить требуемые свойства.

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; }
2 голосов
/ 19 марта 2019

Скорее, используя find лучше создать сначала Карту или объект из любых двух данных, так как поиск по Карте или Объекту имеет сложность O (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
  }]
}

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)
1 голос
/ 19 марта 2019
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);
1 голос
/ 19 марта 2019

Вы можете использовать map примерно так:

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; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...