JQ преобразовать именованный массив в список - PullRequest
1 голос
/ 16 июня 2019

Как взять имена именованного массива, вставить их как элементы в него, а затем удалить имя?

{
  "l1": {
    "v1": {
      "a": [1],
      "b": [2]
    },
    "v2": {
      "a": [3],
      "b": [4]
    }
  },
  "l2": {
    "v3": {
      "a": [5],
      "b": [6]
    },
    "v4": {
      "a": [7],
      "b": [8]
    }
  }
}

в

[
  {
    "id": ["l1"],
    "v1": {
      "a": [1],
      "b": [2]
    },
    "v2": {
      "a": [3],
      "b": [4]
    }
  },
  {
    "id": ["l2"],
    "v3": {
      "a": [5],
      "b": [6]
    },
    "v4": {
      "a": [7],
      "b": [8]
    }
  }
]

Имена ("l1", "l2") априори не известны, равно как и другое содержимое; все, что я знаю, это то, что я хочу взять имена верхнего уровня и вставить их как "id" -именованные объекты.

Я считаю, что это близко к противоположному Используя jq, преобразовать массив пар имя / значение в объект с именованными ключами .

jq 'to_entries'

запускается, но встраивает и "key", и "value", тогда как я действительно просто хочу добавить (prepend) "key", еще лучше контролировать буквальный «ключ» для (скажем) "id".

Ответы [ 2 ]

2 голосов
/ 16 июня 2019

Вы на правильном пути, думая о to_entries:

[to_entries[] | {id: .key} + .value]

Нуф сказал.

0 голосов
/ 16 июня 2019

Вот фрагмент, который работает. Вдобавок к этому вы можете выполнить одну оптимизацию, чтобы использовать карту вместо for in. Но это просто работает

let sourceArr = {
  "l1": {
    "v1": {
      "a": [1],
      "b": [2]
    },
    "v2": {
      "a": [3],
      "b": [4]
    }
  },
  "l2": {
    "v3": {
      "a": [5],
      "b": [6]
    },
    "v4": {
      "a": [7],
      "b": [8]
    }
  }
};

let targetArr = [];

for( let id in sourceArr ){
   let obj = {
       "id": id
   }
   
   let subItem = sourceArr[id];
   //let itemKey = Object.keys(mainItem);
   for( item in subItem ){
      let itemKey = item;
      let itemVal = subItem[item]
      
      let subItems = {};
      subItems[itemKey] = itemVal;
      Object.assign(obj, subItems);
   }
   
   targetArr.push( obj );
   
}

console.log( targetArr );
...