Как добавить пару ключ-значение к объекту - PullRequest
0 голосов
/ 03 апреля 2020

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

Исходный массив:

 data= [
  {
    "flowId": 7079,
    "flowName": "jackson-demo",
    "version": 1,
    "CreatedDate": "2020-04-02",
    "UpdateDate": "",
    "LastRunDate": "2020-04-02",
    "active": false,

"properties": [
  {
    "id": 7080,
    "key": "country",
    "value": "in",
    "category": "General"
  },
  {
    "id": 7081,
    "key": "source",
    "value": "hive",
    "category": "General"
  }
  ]

  },
  {

"flowId": 7079,
"flowName": "jackson-demo",
"version": 1,
"CreatedDate": "2020-04-02",
"UpdateDate": "",
"LastRunDate": "2020-04-02",
"active": false,

"properties": [
  {
    "id": 7080,
    "key": "country",
    "value": "au",
    "category": "General"
  },
  {
    "id": 7081,
    "key": "source",
    "value": "aws",
    "category": "General"
  }
  ]

} ]

Используя приведенный ниже код, я могу получить пару значений ключа:

 for (var i = 0; i < data.length; i++) {
  data[i].properties.forEach((arrayItem, i) => {
    if (arrayItem.key === 'country') {
      console.log('Key: ' + arrayItem.key + ' ' + 'Value: ' + arrayItem.value);
    }
  });
}

Вывод кода:

Key: country Value: au 
Key: country Value: in 

Как мне вернуть sh эти значения обратно в массив так что мой новый массив выглядит так:

data= [
  {
    "flowId": 7079,
    "flowName": "jackson-demo",
    "version": 1,
    "CreatedDate": "2020-04-02",
    "UpdateDate": "",
    "LastRunDate": "2020-04-02",
    "active": false,
    "country": "in"

"properties": [
  {
    "id": 7080,
    "key": "country",
    "value": "in",
    "category": "General"
  },
  {
    "id": 7081,
    "key": "source",
    "value": "hive",
    "category": "General"
  }
  ]

  },
  {

"flowId": 7079,
"flowName": "jackson-demo",
"version": 1,
"CreatedDate": "2020-04-02",
"UpdateDate": "",
"LastRunDate": "2020-04-02",
"active": false,
"country":"au"

"properties": [
  {
    "id": 7080,
    "key": "country",
    "value": "au",
    "category": "General"
  },
  {
    "id": 7081,
    "key": "source",
    "value": "aws",
    "category": "General"
  }
  ]

} ]

Ответы [ 3 ]

0 голосов
/ 03 апреля 2020

Вы можете использовать Object.fromEntries:

for (let item of data) {
  Object.assign(item,
    Object.fromEntries(item.properties.map(({key, value}) => [key, value]))
  );
}

Если вы хотите добавить несколько этих пар, вы можете связать .filter в результат .map или, если вам просто нужно один ("страна"), используйте более простой c шаблон программирования:

for (let item of data) {
  item.country = item.properties.find(({key}) => key == "country").value;
}
0 голосов
/ 03 апреля 2020

Это создает новый массив с копиями ваших объектов, имеющих дополнительное свойство country, если оно найдено:

const addCountry = data => data .map (({properties, ...rest}) => {
  const country = properties .find (({key}) => key == 'country')
  return {
    ... rest,
    ... (country ? {country: country .value} : {}),
    properties
  }
})


const data = [{flowId: 7079, flowName: "jackson-demo", version: 1, CreatedDate: "2020-04-02", UpdateDate: "", LastRunDate: "2020-04-02", active: false, properties: [{id: 7080, key: "country", value: "in", category: "General"}, {id: 7081, key: "source", value: "hive", category: "General"}]}, {flowId: 7079, flowName: "jackson-demo", version: 1, CreatedDate: "2020-04-02", UpdateDate: "", LastRunDate: "2020-04-02", active: false, properties: [{id: 7080, key: "country", value: "au", category: "General"}, {id: 7081, key: "source", value: "aws", category: "General"}]}];

console .log (
  addCountry (data)
)
.as-console-wrapper {min-height: 100% !important; top: 0}

Если единственное использование properties в выводе уже удовлетворено этим извлечением, то вы можете пропустить строку properties в выводе и получить более легкие версии для дальнейшей обработки.

Конечно, мы можем изменить исходные данные, но мы не варвары, верно?

0 голосов
/ 03 апреля 2020

Попробуйте обновить data[i], используя оператор распространения:

 for (var i = 0; i < data.length; i++) {
  data[i].properties.forEach((arrayItem, i) => {
    if (arrayItem.key === 'country') {
      data[i] = { ...data[i] , arrayItem }
    }
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...