给定一个嵌套的对象是这样的:
var cars = {
"bentley": {
"suppliers": [
{
"location": "England",
"name": "Sheffield Mines"}
]
// ...
}
};
和一个这样的数组["bentley", "suppliers", "0", "name"]
有一个现有的功能,这将采摘的最深元件,即pluck_innards(cars, ['bentley', "suppliers", "0", "name"])
和返回‘谢菲尔德矿’。
换句话说,是否有一个功能(我将其命名为deep_pluck
),其中
deep_pluck(cars, ['bentley', 'suppliers', '0', 'name'])
=== cars['bentley']['suppliers']['0']['name']
在我看来,这是简单的,但很常见,对可能一直在使用Javascript工具库,如一个完成的jQuery或LO-破折号 /下划线-但我还没有看到它。
我的想法是一些小事,沿着线:
function deep_pluck(array, identities) {
var this_id = identities.shift();
if (identities.length > 0) {
return deep_pluck(array[this_id], identities);
}
return array[this_id];
}
我已经张贴上的jsfiddle 。
如果功能足够聪明,需要在阵列中的数值索引时找出这将是有益的,当然。 我不知道随便什么其他注意事项可能是一个问题。
这是我的东西想象已经被巧妙地解决了所有相当长的问题,但我认为这后,我会希望看到的解决方案是在那里什么。
我不认为,如果你将它们作为数字你必须与数组索引的问题0
。
这里是你的函数的替代版本,且无需递归:
function deep_pluck(object, identities) {
var result = object;
for(var i = 0; i < identities.length; i++) {
result = result[identities[i]];
}
return result;
}
工作示例这里: http://jsfiddle.net/AmH2w/1/
dotty.get(OBJ,pathspec)这样做,接受任一阵列或虚线字符串作为pathspec。
多点的是开源的,并且还具有存在的方法,以及一推杆。
该方法是递归和非常相似,你的想法,只是疯疯癫癫包括对空/未定义对象的测试,以便它不会引发异常的试图访问的东西不存在的元素。
在从文档dotty.get()源张贴下面:
var get = module.exports.get = function get(object, path) {
if (typeof path === "string") {
path = path.split(".");
}
if (!(path instanceof Array) || path.length === 0) {
return;
}
path = path.slice();
var key = path.shift();
if (typeof object !== "object" || object === null) {
return;
}
if (path.length === 0) {
return object[key];
}
if (path.length) {
return get(object[key], path);
}
};
虽然不是一个通用库,似乎CasperJS有这种与它的东西utils.getPropertyPath
功能。
/**
* Retrieves the value of an Object foreign property using a dot-separated
* path string.
*
* Beware, this function doesn't handle object key names containing a dot.
*
* @param Object obj The source object
* @param String path Dot separated path, eg. "x.y.z"
*/
function getPropertyPath(obj, path) {
if (!isObject(obj) || !isString(path)) {
return undefined;
}
var value = obj;
path.split('.').forEach(function(property) {
if (typeof value === "object" && property in value) {
value = value[property];
} else {
value = undefined;
}
});
return value;
}
编辑:
我所遇到的实现,因为解决这个几次,其中包括:
- 在的getObject插件由Ben Alman(在Github上 )。
- 一个我滚-见要点
编辑(2014)
我还要指出,相对较新的lodash.deep
。
下面是使用短ES6实现reduce
:
function get(obj, keyPath) {
return keyPath
.split(".")
.reduce((prev, curr) => prev[curr], obj);
}
用法:
get(cars, "bentley.suppliers.0.name") // -> "Sheffield Mines"
文章来源: Pluck specific javascript value from an object based on an array of indexes