【问题标题】:How to create an array of objects from key values nested in a parent object如何从嵌套在父对象中的键值创建对象数组
【发布时间】:2018-06-29 14:02:56
【问题描述】:

我在一个对象中嵌套了这样的对象:

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

如果嵌套对象中的一个值是真的,我希望从键值创建一个对象数组,并且这还包括作为 [key,value] 对的键:

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

【问题讨论】:

标签: javascript arrays object


【解决方案1】:

只需使用 for...in 循环,如下所示:

var myArray = [];
for(var key in parentObj){
   var childObj = parentObj[key];
   if(childObj.a) {
      myArray.push({a: childObj.a, b: childObj.b, c: key });
   }
}

【讨论】:

  • 不知道为什么这个答案被否决了?似乎按照作者的要求做,(一旦你修复了原始海报 JSON 中的拼写错误)codepen.io/jvmatl/pen/oyJpEg
  • 如果不是错字,你的答案是 {a: true, b: 2, c: "key3"} 那么我们必须为此创建一个数组!
  • @Onk_r OP 的问题指出,要求结果对象“还包括 keys。OP 在示例预期输出中省略了键字符串周围的引号,但是如您的评论所示,这是正确的答案。
【解决方案2】:

这里首先要提到的是

Javascript 中不存在关联数组

你可以看到here

在您的示例中,“key1”是重复的,因此如果您想像 then 那样存储,那么您必须使用 Array 来实现,就像嵌套对象中的值之一为 true 时一样

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);

【讨论】:

    【解决方案3】:

    一个简单的单行解决方案:从对象中提取键并对其进行迭代,同时创建相应的对象并过滤掉虚假的对象:

    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);
    

    【讨论】:

      猜你喜欢
      • 2021-08-02
      • 1970-01-01
      • 2022-11-29
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      相关资源
      最近更新 更多