我试图做一个函数,将基于键求和。这是一个示例对象:
{
"US": {
"q": 1,
"Atlanta": {
"q": 2
},
"Boston": {
"q": 1
}
}
我希望能够调用类似以下的函数:
var sum = plucky("q", obj);
// sum === 4;
我正在使用的函数,我相信我从过去某个地方的SO帖子中发现,几乎可以完成正确的事情:
function pluckDeepKey(key, obj) {
if (_.has(obj, key)) {
return obj[key];
}
return _.reduce(_.flatten(_.map(obj, function(v) {
return _.isObject(v) ? pluckDeepKey(key, v) : [];
}), false), function(a,b) { return a + b });
}
但是,由于:return obj[key]
它找到第一个"q"
,返回该值,然后退出。我整天都在挠头,认为如果我将问题抛给SO的话可能对其他人有帮助。
我认为收集我在问题正文中探索的不同方法可能对SO和我的未来自我很有用。
function plucky(key, obj) {
var sum = 0;
for (var prop in obj) {
if (_.has(obj, prop) && key === prop) {
sum += obj[prop];
}
else if (_.isObject(obj[prop])) {
sum += plucky(key, obj[prop]);
}
}
return sum;
}
function pluckDeepKey(key, obj) {
return _.reduce(obj, function(a, v) {
return a + (_.isObject(v) ? pluckDeepKey(key, v) : 0);
}, _.has(obj, key) ? obj[key] : 0);
}
function moriDeepKey(key, mmap) {
return m.reduce_kv(
function(a, k, v) { return a + (m.is_map(v) ? moriDeepKey(key, v) : 0); },
m.has_key(mmap, key) ? mmap.get(key) : 0,
mmap
);
}
function iDeepKey(key, imap) {
return imap.reduce(
function(a, v, k) { return a + (v instanceof I.Map ? iDeepKey(key, v) : 0); },
imap.has(key) ? imap.get(key) : 0,
imap
);
}
我认为普通的javascript函数看起来会更全面,更简单:
function plucky(key, obj) {
var sum = 0;
for (var prop in obj) {
if (obj.hasOwnProperty(prop) && key === prop) {
sum += obj[prop];
}
else if (Object.prototype.toString.call(obj[prop]) === '[object Object]') {
sum += plucky(key, obj[prop]);
}
}
return sum;
}
function plucky(key, obj) {
var sum = 0;
for (var prop in obj) {
if (obj.hasOwnProperty(prop) && key === prop) {
sum += obj[prop];
}
else if (Object.prototype.toString.call(obj[prop]) === '[object Object]') {
sum += plucky(key, obj[prop]);
}
}
return sum;
}
var obj = {
"US": {
"q": 1,
"Atlanta": {"q": 2},
"Boston": {"q": 1}
}
};
var sum = plucky("q", obj);
alert(sum);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句