Не могу получить доступ к данным внутри вложенного массива объектов - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть массив объектов, которые я хочу перебрать и создать новый массив объектов.

Сначала я сопоставляю данные, затем перебираю каждый объект для извлечения значений.Я хочу сохранить имя и значение Location для каждого объекта.

Мой код возвращает нулевые результаты.Я не могу изменить способ объявления данных.Может кто-нибудь помочь мне понять, почему я продолжаю получать нулевые результаты?

[
  {
    "euValue": null,
    "asValue": null
  }
]

const data = [{
  Locations: [{
      Location: {
        Name: "Europe"
      },
      Value: "Ireland"
    },
    {
      Location: {
        Name: "Asia"
      },
      Value: "China"
    }
  ]
}];

const formatData = () => {
  let formattedData = [];
  let euValue, asValue;

  formattedData = data.map(location => {
    for (const l in location) {
      if (location.hasOwnProperty(l)) {
        const _this = location[l];
        euValue = _this.Location === "Europe" ? _this.Value : null;
        asValue = _this.Location === "Asia" ? _this.Value : null;
      }
    }
    return {
      euValue,
      asValue
    };
  });

  return formattedData;
};

const newData = formatData();
console.log(newData);

Редактировать Ожидаемый результат

[
  {
    "euValue": “Ireland”,
    "asValue": “China”
  }
]

Ответы [ 5 ]

1 голос
/ 24 сентября 2019

вы пропустили второй цикл, также вы перезаписали usValue и euValue и вам лучше использовать forEach вместо map в этом случае.

const data = [{
  Locations: [{
      Location: {
        Name: "Europe"
      },
      Value: "Ireland"
    },
    {
      Location: {
        Name: "Asia"
      },
      Value: "China"
    }
  ]
}];

const formatData = (data) => {
  let formattedData = [],
    values = {};

  data.forEach(location => {
    for (const l in location) {
      if (location.hasOwnProperty(l)) {

        const _this = location[l];

        _this.forEach(el => {

          if (el.Location.Name === "Europe") {
            values["euValue"] = el.Value || null
          }
          if (el.Location.Name === "Asia") {
            values["asValue"] = el.Value || null
          }
        })
      }
    }
  });

  formattedData.push(values)

  return formattedData;
};

console.log(formatData(data))
1 голос
/ 24 сентября 2019

Предполагая, что внутри data у вас может быть несколько объектов с массивом Location, который имеет только 2 объекта (один для Европы и другой для Азии), вы должны изменить свою функцию на что-то вроде

    const data = [
      {
        Locations: [
          {
            Location: { Name: "Europe" },
            Value: "Ireland"
          },
          {
            Location: { Name: "Asia" },
            Value: "China"
          }
        ]
      }
    ];
    const formatData = () => {
        // iterate all data objects
    	return data.map((topLocation) => {
        const res = {};
        // loop over Location children objects
        topLocation.Locations.forEach((location) => {
          const { Name } = location.Location;
          // decide where to save Value base on the Location.name
          if (Name === "Europe") {
            res.euValue = location.Value;
          } else if (Name === "Asia") {
            res.asValue = location.Value;
          }
        });
        return res;
      });
    };
    const newData = formatData();
    console.log(newData);
0 голосов
/ 24 сентября 2019

Я уверен, что многие другие ответы хороши, но я сделал классический цикл for для перебора данных.Я хотел бы сохранить ваши троичные операторы, но я думаю, что вам может понадобиться синтаксис if / else.

var data = [{
  Locations: [{
      Location: {
        Name: "Europe"
      },
      Value: "Ireland"
    },
    {
      Location: {
        Name: "Asia"
      },
      Value: "China"
    }
  ]
}];

const formatData = () => {
  let formattedData = [];
  let euValue, asValue;

  formattedData = data.map(location => {
    for (const l in location) {
      if (location.hasOwnProperty(l)) {
        const _this = location[l];
        for (let i = 0; i < _this.length; i++) {
          if (_this[i].Location.Name === "Europe") {
            euValue = _this[i].Value;
          } else if (_this[i].Location.Name === "Asia") {
            asValue = _this[i].Value;
          } else {
            euValue, asValue = null;
          }

        }

      }

    }
    return {
      euValue,
      asValue
    };
  });
  return formattedData;
};
const newData = formatData();
console.log(newData);
0 голосов
/ 24 сентября 2019

Использование Array.prototype.flatMap () может помочь вам получить желаемый массив более чистым способом:

const data = [{
  Locations: [{
      Location: {
        Name: "Europe"
      },
      Value: "Ireland"
    },
    {
      Location: {
        Name: "Asia"
      },
      Value: "China"
    }
  ]
}];

const formatData = () => {
  const formattedData = data.flatMap(item => {
    const object = {}
    item.Locations.map(location => {
      const continent = location.Location.Name
      let country = {}
      if (continent === 'Europe') country = {
        euValue: location.Value
      }
      if (continent === 'Asia') country = {
        asValue: location.Value
      }
      Object.assign(object, country)

    });
    return object

  });
  return formattedData;
}

const newData = formatData();
console.log(newData);
0 голосов
/ 24 сентября 2019

Я не знаю, что вы хотите получить от своего кода, но этот код может вам помочь.

const data = [{
  Locations: [{
      Location: {
        Name: "Europe"
      },
      Value: "Ireland"
    },
    {
      Location: {
        Name: "Asia"
      },
      Value: "China"
    }
  ]
}];

const formatData = () => {
  let formattedData = [];

  formattedData = data.map(location => {
    let euValue = [],
      asValue = [];
    for (const l in location.Locations) {
      if (location.Locations.hasOwnProperty(l)) {
        const _this = location.Locations[l];
        if (_this.Location.Name === "Europe")
          euValue.push(_this.Value);
        else if (_this.Location.Name === "Asia")
          asValue.push(_this.Value);
      }
    }
    return {
      euValue,
      asValue
    };
  });

  return formattedData;
};

const newData = formatData();
console.log(newData);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...