2017-03-18 34 views
0

标题。我可以有两种或三种类型的对象,但如果有任何新的键/属性将被添加到未来的对象,我想要做出可靠的函数来覆盖所有其他情况。甚至通过与其他对象相比没有一个或两个键的对象映射对象数组

每当我通过具有相同属性的对象映射(obj1obj4)一切都K.的问题是,当我想打一个功能通过arr所有对象keys映射,可能会或可能不会在特定对象。

我正在考虑if ('key' in obj),但是如果除非我能通过创建具有唯一键对象的新数组来分析所有对象键,否则如果可以添加新键,那么这将不会使功能可靠。但是如果对象有10个键,并且数组中会有1000个以上的对象,我认为会有性能问题;如我错了请纠正我。

同样适用于.hasOwnProperty()

const arr = [ 
    obj1 = { 
    key1: val1, 
    key2: val2, 
    key3: val3 
    }, 
    obj2 = { 
    key3: val3 
    }, 
    obj3 = { 
    key1: val4, 
    key2: val5, 
    key3: val1 
    }, 
    obj4 = { 
    key1: val6, 
    key2: val7 
    } 
] 
+0

不清楚你在问什么。 –

+0

你想要什么?我有一种奇怪的感觉,就像你需要'Object.assign()' – Redu

+0

什么是*“K”*?请添加一些用例。 –

回答

0

从疯狂的猜测你可能需要一个函数,如;

function fillMissingKeys(a){ 
 
    var keys = a.reduce((k,o) => Object.assign(k,Object.keys(o)),[]) 
 
       .reduce((o,k) => (o[k] = null,o),{}); 
 
      
 
    return a.map(o => Object.assign({},keys,o)); 
 
} 
 

 
var arr = [ 
 
    obj1 = { 
 
    key1: "val1", 
 
    key2: "val2", 
 
    key3: "val3" 
 
    }, 
 
    obj2 = { 
 
    key3: "val3" 
 
    }, 
 
    obj3 = { 
 
    key1: "val4", 
 
    key2: "val5", 
 
    key3: "val1", 
 
    key4: "val8" 
 
    }, 
 
    obj4 = { 
 
    key1: "val6", 
 
    key2: "val7" 
 
    } 
 
]; 
 

 
console.log(fillMissingKeys(arr))

+0

正在编辑帖子,思考看看你的答案,事实上,这就是我正在寻找!完全忘记了'Object.assign' – nehel

1

相反居兴,一个对象可以有钥匙,你可以使用Object.keysfor...in循环来动态地通过对象的键获取或循环。就像这样:

var obj = { 
 
    "key1": 2, 
 
    "key2": 3, 
 
    "key-unknown": 5 
 
} 
 

 
console.log("METHOD 1:"); 
 
var keys = Object.keys(obj); 
 
console.log("obj has these keys: ", keys); 
 

 
console.log("\nMETHOD 2:"); 
 
for(var key in obj) { 
 
    console.log("'" + key + "' is a key"); 
 
}

利用上述两种方法,你可以安全地,动态地只使用该对象有钥匙,而不是使用一组预定义的静态密钥,可能会或可能不会在该对象并且可能比对象实际所具有的更少。