我有以下Javascript对象:
doc = {};
doc.title = 'a title';
doc.date = 'a date';
doc.send = {
date: new Date(),
sender: 'a sender',
receiver: 'a receiver'
};
我有以下功能:
doSomething(item, property) {
console.log(item[property];
}
如果我拨打doSomething(doc, 'date')
,它就有效,但如果我使用doSomething(doc, 'send.date')
则无效。
由于该函数必须是可重用的,如何让它处理任何类型的属性,包括嵌套的?
我看到lodash
对_.get
有帮助,但我使用的underscore
不包含该方法。另外,我不想使用和安装其他库。有什么想法吗?
答案 0 :(得分:0)
您可以编写一个函数来查找(嵌套)属性值,例如:
function findDeepProp(obj, prop) {
return prop.split('.').reduce((r, p)=> r[p], obj)
}
findDeepProp(doc, 'title'); // a title
findDeepProp(doc, 'send.sender'); // a sender
答案 1 :(得分:0)
这有点危险,取决于你想要做什么,我建议你阅读this,但我认为这会有效:
doSomething = function(element, property){
console.log(eval("element." + property));
}
答案 2 :(得分:0)
如果要检查多个嵌套级别,可以使用使用递归的函数。
var doc = {
title: 'a title', date: 'a date',
send: { date: +new Date(), sender: 'a sender', receiver: 'a receiver',
thing: {
fullname: { first: 'Bob', last: 'Smith' }
}
}
}
function findDeepProp(obj, prop) {
// create an array from the props argument
var target = prop.split('.'), out;
// iteration function accepts an object and target array
(function iterate(obj, target) {
// remove the first array element and assign it to tmp
var tmp = target.shift();
// if target has no more elements and tmp
// exists as a key in the object passed into iterate()
// return its value
if (target.length === 0 && obj[tmp]) return out = obj[tmp];
// if the key exists in the object passed into iterate()
// but it is an object, run iterate() with that object
// and the reduced target array
if (obj[tmp] && typeof obj[tmp] === 'object') iterate(obj[tmp], target);
return;
}(obj, target));
return out;
}
findDeepProp(doc, 'send.thing.fullname.first') // Bob
findDeepProp(doc, 'send.thing.fullname.last') // Smith