Как создать массив объектов из ключевых значений, вложенных в родительский объект - PullRequest
0 голосов
/ 29 июня 2018

У меня есть вложенные объекты внутри объекта как таковые:

var parentObj = { 
   key1: {
     a: true,
     b: 2
   },
   key2: {
     a: false,
     b: 2
   },
   key3: {
     a: true,
     b: 2
   }
}

Я хочу создать массив объектов из значений ключей, если одно из значений во вложенных объектах имеет значение true, и это также включает ключи в виде пары [key,value] как таковой:

parentobj = [
  {
    a: true,
    b: 2,
    c: "key1" 
  },
  {
    a: true,
    b: 2,
    c: "key3"
  }
]

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Первое, что стоит упомянуть, это

Ассоциативные массивы не существуют в Javascript

Вы можете увидеть здесь

В вашем примере «key1» дублируется, поэтому, если вы хотите сохранить как, то вы должны использовать Array для этого, как если бы одно из значений во вложенных объектах было истинным

var parentObj = {
   key1: [
       {
         a: true,
         b: 2
       },
       {
         a: false,
         b: 2
       }
   ],
   key3: [
       {
         a: true,
         b: 2
       }
   ]
};

В этом случае то, что вы хотите, делается так!

var parentObj = {
   key1: [
       {
         a: true,
         b: 2
       },
       {
         a: false,
         b: 2
       }
   ],
   key3: [
       {
         a: true,
         b: 2
       }
   ]
};
var myArray = [];
for(var key in parentObj){
   var childObj = parentObj[key];
   var res = childObj.filter(function(element){
       return  element.a == true;
   });
   for(ele in res){
       res[ele].c = key;
   }
   if(res.length > 0){
       // if you want any of element having true property
       myArray.push(res[0]);
   }
}
console.log(myArray);
0 голосов
/ 30 июня 2018

Простое однострочное решение: извлекать ключи из объекта и перебирать их при создании соответствующих объектов и отфильтровывать ложные:

var parentObj = { 
   key1: {
     a: true,
     b: 2
   },
   key2: {
     a: false,
     b: 2
   },
   key3: {
     a: true,
     b: 2
   }
};

var result = Object.keys(parentObj).map(k => (Object.assign({}, parentObj[k], {c: k}))).filter(({a}) => a);

console.log(result);
0 голосов
/ 29 июня 2018

Просто используйте for ... in loop, вот так:

var myArray = [];
for(var key in parentObj){
   var childObj = parentObj[key];
   if(childObj.a) {
      myArray.push({a: childObj.a, b: childObj.b, c: key });
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...