Перебирайте json и извлекайте конкретные значения в nodejs - PullRequest
0 голосов
/ 15 октября 2019

У меня есть сценарий, в котором я пытаюсь проанализировать этот ниже json и получить все значения ключа "name" и ключа "id", которые я бы в дальнейшем сохранял в переменной или массиве.

  [
      {
        "metadata": {
          "id": "vvvvvvvvvvvvv",
          "url": "cccccccccccccc",
          "created_at": "2019-09-06T08:40:41Z",
          "updated_at": "2019-09-06T13:25:46Z"
        },
        "entity": {
          "name": "app1",
          "b_enabled": false,
          "d_url": "xxxxxs"
        }
      },
        {
        "metadata": {
          "id": "vvvvvvvvvvccc",
          "url": "cccccccccccccc",
          "created_at": "2019-09-06T08:40:41Z",
          "updated_at": "2019-09-06T13:25:46Z"
        },
        "entity": {
          "name": "app2",
          "b_enabled": false,
          "d_url": "xxxxxs"
        }
      },
        {
        "metadata": {
          "id": "vvvvvvvvvvddd",
          "url": "cccccccccccccc",
          "created_at": "2019-09-06T08:40:41Z",
          "updated_at": "2019-09-06T13:25:46Z"
        },
        "entity": {
          "name": "app3",
          "b_enabled": false,
          "d_url": "xxxxxs"
        }
      },
        {
        "metadata": {
          "id": "vvvvvvvvvveee",
          "url": "cccccccccccccc",
          "created_at": "2019-09-06T08:40:41Z",
          "updated_at": "2019-09-06T13:25:46Z"
        },
        "entity": {
          "name": "app4",
          "b_enabled": false,
          "d_url": "xxxxxs"
        }
      },
        {
        "metadata": {
          "id": "vvvvvvvvvvfff",
          "url": "cccccccccccccc",
          "created_at": "2019-09-06T08:40:41Z",
          "updated_at": "2019-09-06T13:25:46Z"
        },
        "entity": {
          "name": "app5",
          "b_enabled": false,
          "d_url": "xxxxxs"
        }
    }
    ]

То, что я пробовал до сих пор (после этого не знаю, как поступить, так как это само по себе дает неверный результат)

 const dJSON = require('dirty-json');

 const jsn = dJSON.parse(get_all)
 console.log(JSON.stringify(jsn));
 jsonData = JSON.stringify(jsn)
 console.log(jsonData.length) //this returns wrong value

for(var i = 0; i < jsonData.length; i++){
    for(key in jsonData[i].entity){
      if(jsonData[i].entity[key] == "name"){
          return console.log(key);
          }
      }
}

Это не возвращает ожидаемый результат. Может кто-нибудь посоветовать здесь, так как я новичок в nodejs & javascript, как мне извлечь результат, подобный этому

ожидаемый o / p:

{ 
  "app1"   :  "vvvvvvvvvvvvv", 
  "app2"   :  "vvvvvvvvvvccc",
  "app3"   :  "vvvvvvvvvvddd",
  "app4"   :  "vvvvvvvvvveee",
  "app5"   :  "vvvvvvvvvvfff" 
}

Ответы [ 6 ]

3 голосов
/ 15 октября 2019

Здесь я использую JSON.parse , поэтому я могу использовать метод Array.map для данных, я использую Разрушение объекта в обратном вызове, переданном на картувывести значения metadata.id и entity.name в область действия функции. Затем я возвращаю один объект с entity.name в качестве ключа и metadata.id в качестве значения. Возвращаемое значение из map является новым массивом, поэтому я могу использовать Array.reduce для преобразования массива в другую структуру данных. На каждой итерации reduce параметр current будет отдельным объектом, который был возвращен из каждой итерации map. Поскольку Object.keys(current) всегда будет иметь длину 1, я могу использовать деструктуризацию, чтобы извлечь единственное имя ключа, и использовать ключ / name, чтобы заполнить возвращаемый объект.

const json = `[
    {
      "metadata": {
        "id": "vvvvvvvvvvvvv",
        "url": "cccccccccccccc",
        "created_at": "2019-09-06T08:40:41Z",
        "updated_at": "2019-09-06T13:25:46Z"
      },
      "entity": {
        "name": "app1",
        "b_enabled": false,
        "d_url": "xxxxxs"
      }
    },
      {
      "metadata": {
        "id": "vvvvvvvvvvccc",
        "url": "cccccccccccccc",
        "created_at": "2019-09-06T08:40:41Z",
        "updated_at": "2019-09-06T13:25:46Z"
      },
      "entity": {
        "name": "app2",
        "b_enabled": false,
        "d_url": "xxxxxs"
      }
    },
      {
      "metadata": {
        "id": "vvvvvvvvvvddd",
        "url": "cccccccccccccc",
        "created_at": "2019-09-06T08:40:41Z",
        "updated_at": "2019-09-06T13:25:46Z"
      },
      "entity": {
        "name": "app3",
        "b_enabled": false,
        "d_url": "xxxxxs"
      }
    },
      {
      "metadata": {
        "id": "vvvvvvvvvveee",
        "url": "cccccccccccccc",
        "created_at": "2019-09-06T08:40:41Z",
        "updated_at": "2019-09-06T13:25:46Z"
      },
      "entity": {
        "name": "app4",
        "b_enabled": false,
        "d_url": "xxxxxs"
      }
    },
      {
      "metadata": {
        "id": "vvvvvvvvvvfff",
        "url": "cccccccccccccc",
        "created_at": "2019-09-06T08:40:41Z",
        "updated_at": "2019-09-06T13:25:46Z"
      },
      "entity": {
        "name": "app5",
        "b_enabled": false,
        "d_url": "xxxxxs"
      }
  }
  ]`;

const result = JSON.parse(json)
    .map(({ metadata: { id }, entity: { name } }) => {
        return { [name]: id };
    })
    .reduce((prev, current) => {
        const [name] = Object.keys(current);

        prev[name] = current[name];

        return prev;
    }, {});

console.log(result);
0 голосов
/ 15 октября 2019

var arr=[
    {
      "metadata": {
        "id": "vvvvvvvvvvvvv",
        "url": "cccccccccccccc",
        "created_at": "2019-09-06T08:40:41Z",
        "updated_at": "2019-09-06T13:25:46Z"
      },
      "entity": {
        "name": "app1",
        "b_enabled": false,
        "d_url": "xxxxxs"
      }
    },
      {
      "metadata": {
        "id": "vvvvvvvvvvccc",
        "url": "cccccccccccccc",
        "created_at": "2019-09-06T08:40:41Z",
        "updated_at": "2019-09-06T13:25:46Z"
      },
      "entity": {
        "name": "app2",
        "b_enabled": false,
        "d_url": "xxxxxs"
      }
    },
      {
      "metadata": {
        "id": "vvvvvvvvvvddd",
        "url": "cccccccccccccc",
        "created_at": "2019-09-06T08:40:41Z",
        "updated_at": "2019-09-06T13:25:46Z"
      },
      "entity": {
        "name": "app3",
        "b_enabled": false,
        "d_url": "xxxxxs"
      }
    },
      {
      "metadata": {
        "id": "vvvvvvvvvveee",
        "url": "cccccccccccccc",
        "created_at": "2019-09-06T08:40:41Z",
        "updated_at": "2019-09-06T13:25:46Z"
      },
      "entity": {
        "name": "app4",
        "b_enabled": false,
        "d_url": "xxxxxs"
      }
    },
      {
      "metadata": {
        "id": "vvvvvvvvvvfff",
        "url": "cccccccccccccc",
        "created_at": "2019-09-06T08:40:41Z",
        "updated_at": "2019-09-06T13:25:46Z"
      },
      "entity": {
        "name": "app5",
        "b_enabled": false,
        "d_url": "xxxxxs"
      }
  }
  ]
  
  var myMap =new Map();
 
  arr.forEach((element,index)=>{
    var a= arr[index]
    var id='';
    var name='';
    
   var c= Object.keys(a).map(item=>{
     // console.log(item)
       if(item=="metadata"){
       id=a[item]["id"]
       
       }
      else{
         name=a[item]["name"]
         
         }
        }
   )
  myMap[name]=id;
      
     
  })
  console.log(myMap)
   
 

Ну, не самое лучшее и оптимизированное решение (я слишком новичок в js), но это решает вашу проблему. Я просто пытаюсь получить каждый элемент массива, который является объектом, а затем внутри каждого объекта пытаюсь получить ключи индивидуума и сохранить его в переменной, а затем перенести его на карту для желаемого результата. Ps использовать ваш вход как обр. enter image description here

0 голосов
/ 15 октября 2019

Вы можете использовать простую функцию forEach() для итерации по вашему массиву. Вы можете использовать текущий элемент итерации для заполнения другого объекта, как вы и просили в своем вопросе.

Итак, сначала вы можете создать объект для хранения отфильтрованных результатов в:

output = {}

Далее вы можете перебирать массив и заполнять ваш выходной объект:

your_array.forEach(item => {output[item.entity.name] = item.metadata.id})

Это заполнит объект output парами ключ-значение.

Итак, что именно он делает, так это то, что для каждого item в your_array он будет выполнять (лямбда) функцию {output[item.entity.name] = item.metadata.id}, где item - текущий элемент итерации.


Общий код:

var output = {};
your_array.forEach(item => {output[item.entity.name] = item.metadata.id});

// output will now be: 
//  { 
//    "app1"   :  "vvvvvvvvvvvvv", 
//    "app2"   :  "vvvvvvvvvvccc",
//    "app3"   :  "vvvvvvvvvvddd",
//    "app4"   :  "vvvvvvvvvveee",
//    "app5"   :  "vvvvvvvvvvfff" 
//  }
0 голосов
/ 15 октября 2019

добро пожаловать в stackoverflow! Вам нужно только один раз пройтись по своему Json, а затем получить metadata.id и entity.name каждого элемента:

let json = [
      {
        "metadata": {
          "id": "vvvvvvvvvvvvv",
          "url": "cccccccccccccc",
          "created_at": "2019-09-06T08:40:41Z",
          "updated_at": "2019-09-06T13:25:46Z"
        },
        "entity": {
          "name": "app1",
          "b_enabled": false,
          "d_url": "xxxxxs"
        }
      },
        {
        "metadata": {
          "id": "vvvvvvvvvvccc",
          "url": "cccccccccccccc",
          "created_at": "2019-09-06T08:40:41Z",
          "updated_at": "2019-09-06T13:25:46Z"
        },
        "entity": {
          "name": "app2",
          "b_enabled": false,
          "d_url": "xxxxxs"
        }
      },
        {
        "metadata": {
          "id": "vvvvvvvvvvddd",
          "url": "cccccccccccccc",
          "created_at": "2019-09-06T08:40:41Z",
          "updated_at": "2019-09-06T13:25:46Z"
        },
        "entity": {
          "name": "app3",
          "b_enabled": false,
          "d_url": "xxxxxs"
        }
      },
        {
        "metadata": {
          "id": "vvvvvvvvvveee",
          "url": "cccccccccccccc",
          "created_at": "2019-09-06T08:40:41Z",
          "updated_at": "2019-09-06T13:25:46Z"
        },
        "entity": {
          "name": "app4",
          "b_enabled": false,
          "d_url": "xxxxxs"
        }
      },
        {
        "metadata": {
          "id": "vvvvvvvvvvfff",
          "url": "cccccccccccccc",
          "created_at": "2019-09-06T08:40:41Z",
          "updated_at": "2019-09-06T13:25:46Z"
        },
        "entity": {
          "name": "app5",
          "b_enabled": false,
          "d_url": "xxxxxs"
        }
    }
    ]
    
  
    let output = {};
    
    // we parse each element of the json array
    for(let i = 0; i < json.length; i ++ ) {
      // we get the current element.
      let currentElement = json[i];
      // here, we are using the name of the entity as the key and the id of the metadata as the value
      output[currentElement.entity.name] = currentElement.metadata.id;
    }
    
    console.log(output);
0 голосов
/ 15 октября 2019
  const jsObj = JSON.parse(json);
  const result = jsObj.map(entry => ({name: entry.entity.name, id: entry.metadata.id}));
  const objResult = {};
  result.forEach(entry => {
    objResult[entry.name] = entry.id;
  });
  console.log(objResult);

Выход:

{ app1: 'vvvvvvvvvvvvv',
  app2: 'vvvvvvvvvvccc',
  app3: 'vvvvvvvvvvddd',
  app4: 'vvvvvvvvvveee',
  app5: 'vvvvvvvvvvfff' }
0 голосов
/ 15 октября 2019

На выходе

key = entity.name

val = metadata.id

каждого документа

Подход прост. Вставьте пустой объект. Поместите ключ, val в пустой объект.

var result = {}
jsonData.forEach(x => {
   result[x.entity.name]= x.metadata.id
})

https://jsfiddle.net/v8w2L1oa/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...