简体   繁体   中英

Export some properties from the nested object

Let's say there is an object that looks like this:

const object = {
  cars: {
    car1: {
      model: "Car 1 model",
      name: "Car 1 name", // <-- export this
    },
    car2: {
      model: "Car 2 model",
      name: "Car 2 name", // <-- export this
    },
  },
  bikes: {
    bike1: {
      model: "Bike 1 model",
      name: "Bike 1 name", // <-- export this
    },
    bike2: {
      model: "Bike 2 model",
      name: "Bike 2 name", // <-- export this
    },
  },
};

Now I would like to export some of the nested values so that it can be used in various files across the app ( exporting the entire object is not an option ). What we could do is manually create all the required variables and export them like this:

export const car1Name = object.cars.car1.name;
export const car2Name = object.cars.car2.name;
export const bike1Name = object.bikes.bike1.name;
export const bike2Name = object.bikes.bike2.name;

The problem is that if we add more properties to this object (more cars or bikes), it will be very difficult to maintain as we have to manually create new variable and export them each time something new is added. Could you advice how this can be improved?

I suppose you could iterate through the object, construct a similar key for each vehicle/model, then export another object or array with that data.

 const object = { cars: { car1: { model: "Car 1 model", name: "Car 1 name", // <-- export this }, car2: { model: "Car 2 model", name: "Car 2 name", // <-- export this }, }, bikes: { bike1: { model: "Bike 1 model", name: "Bike 1 name", // <-- export this }, bike2: { model: "Bike 2 model", name: "Bike 2 name", // <-- export this }, }, }; const modelNames = Object.fromEntries( Object.values(object).flatMap(vehicles => ( Object.entries(vehicles).map(([key, { name }]) => [key, name]) )) ); console.log(modelNames);

or

 const object = { cars: { car1: { model: "Car 1 model", name: "Car 1 name", // <-- export this }, car2: { model: "Car 2 model", name: "Car 2 name", // <-- export this }, }, bikes: { bike1: { model: "Bike 1 model", name: "Bike 1 name", // <-- export this }, bike2: { model: "Bike 2 model", name: "Bike 2 name", // <-- export this }, }, }; const modelNames = Object.fromEntries( Object.entries(object).flatMap(([vehicleType, vehicles]) => ( Object.entries(vehicles).map(([key, { name }]) => [vehicleType + '_' + key, name]) )) ); console.log(modelNames);

or

 const object = { cars: { car1: { model: "Car 1 model", name: "Car 1 name", // <-- export this }, car2: { model: "Car 2 model", name: "Car 2 name", // <-- export this }, }, bikes: { bike1: { model: "Bike 1 model", name: "Bike 1 name", // <-- export this }, bike2: { model: "Bike 2 model", name: "Bike 2 name", // <-- export this }, }, }; const modelNames = JSON.parse(JSON.stringify( object, (key, value) => 'name' in value? value.name: value )); console.log(modelNames);

enter code here

 const object = { cars: { car1: { model: "Car 1 model", name: "Car 1 name", // <-- export this }, car2: { model: "Car 2 model", name: "Car 2 name", // <-- export this }, }, bikes: { bike1: { model: "Bike 1 model", name: "Bike 1 name", // <-- export this }, bike2: { model: "Bike 2 model", name: "Bike 2 name", // <-- export this }, }, }; let objForExport = {}; for(const vehicleType in object){ for(const vehicleModel in object[vehicleType]){ objForExport[vehicleModel] = object[vehicleType][vehicleModel].name } } export default objForExport

You shouldn't be using variables like car1 , car2 , the appropriate data structure to use is an array instead. This code will export an object with arrays of each of the model names for each vehicle type:

 const object = { cars: { car1: { model: "Car 1 model", name: "Car 1 name", // <-- export this }, car2: { model: "Car 2 model", name: "Car 2 name", // <-- export this }, }, bikes: { bike1: { model: "Bike 1 model", name: "Bike 1 name", // <-- export this }, bike2: { model: "Bike 2 model", name: "Bike 2 name", // <-- export this }, }, } const models = Object.fromEntries( Object.entries(object).map(([vtype, veh]) => [ vtype, Object.values(veh).flatMap(o => o.name) ]) ) console.log(models)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM