如何在JavaScript中描述函数的参数位置
How to describe the location of a parameter to a function in JavaScript
我不确定我在主题中是否很好地描述了这个问题。我不确定"location"是否是描述嵌套在对象中的参数位置的正确方式。
下面是我创建的一个函数,它搜索一个对象数组,并返回具有特定值属性的第一个对象的索引。
function indexOfItemWithParam( items, location, value ) {
var itemsIndex,
directions = location.split( '.' ),
directionsIndex,
property;
for( itemsIndex = 0; itemsIndex < items.length; itemsIndex++ ) {
property = items[ itemsIndex ];
for( directionsIndex = 0; directionsIndex < directions.length; directionsIndex++ ) {
property = property[ directions[ directionsIndex ] ];
}
if( property == value ) {
return itemsIndex;
}
}
return false;
}
此函数的特殊之处在于,如果您有包含对象的对象,则可以描述对象层次结构中某个属性的位置。
var people = [
{
id: 1,
names: {
first: 'John',
last: 'Smith'
},
age: 45
},
{
id: 2,
names: {
first: 'Jane',
last: 'Jones'
},
age: 30
},
];
console.log( indexOfItemWithParam( people, 'names.first', 'Jane' ) );
控制台将返回索引位置1
。具有属性names
且属性first
值为Jane
的第一个对象的位置。正如您所看到的,我正在传递一个字符串,该字符串模仿在JavaScript中导航对象的方式,使用句号作为分隔符将其拆分为一个数组,然后循环浏览每个项目以浏览对象。
这感觉很奇怪,好像应该有更好的方法来做这件事。我找不到任何其他函数试图做类似事情的例子。这种方法,即传递字符串、分解和循环,是导航嵌套对象的最佳方式吗?
我找不到任何其他函数试图做类似事情的例子。
事实上,有很多这样的例子,看看用字符串键访问嵌套的JavaScript对象,或者将点符号中的JavaScript字符串转换为对象引用。
这种方法,即传递字符串、分解和循环,是导航嵌套对象的最佳方式吗?
没有。循环对于访问嵌套属性是非常必要的,但不应将路径作为字符串传递。让您的函数立即获取数组。这更加方便和通用:
- 您没有责任(正确)解析/分解字符串
- 通常情况下,调用者也是泛型的,并且已经使用了数组
- 无需担心边缘情况(如数组索引、符号键或包含点的属性名)
function indexOfItemWithParam(items, path, value) {
for (var itemsIndex = 0; itemsIndex < items.length; itemsIndex++ ) {
var property = path.reduce(function(property, direction) {
return property[direction];
}, items[itemsIndex]);
if (property === value)
return itemsIndex;
}
return -1;
}
// call as
indexOfItemWithParam(people, 'names.first'.split('.'), 'Jane') // or
indexOfItemWithParam(people, ['names', 'first'], 'Jane')
最通用的方法不是采用属性路径,而是使用一个回调函数,您可以应用该函数来获取要比较的"属性"值。这也是本机数组迭代方法(如上面的reduce
)的工作方式。使用例如findIndex
,您根本不需要helper方法,只需调用即可
people.findIndex(function(item) { return item.names.first === 'Jane'; })
看起来您正在为JSON寻找类似xpath的语法(类似于JSON Path)。
试试goessner和这个JSONPath。
- 函数参数中的数据与指定变量之间的任何性能差异
- AngularJS:我可以跳过函数参数回调吗
- 为什么不'我们在javascript中使用函数参数的数据类型
- 使用闭包共享构造函数参数
- 函数参数的值错误
- 当一个重要的构造函数参数丢失时应该发生什么
- 阻止ReSharper将JavaScript函数参数放到新行中
- 根据函数参数将CSS值存储在var中,然后对其进行操作
- 使构造函数参数具有ES6类方法的特权
- 当客户端将两个按钮的javascript函数参数修改为相同时,SQL/PHP会更新多行
- Windows.Networking.EndpointPair构造函数参数
- 是否可以使用Sinon.JS检查函数参数绑定是否正确
- 大括号中的Javascript函数参数
- jQuery 无法使用 AJAX 调用访问函数内部的函数参数
- 将JSON字符串转换为函数参数
- eval()读取函数参数有多糟糕
- Javascript不能在一个命令中使用函数参数
- 函数参数在内部不可见,返回新的Promise(函数(resolve,reject).传递给被promise化的函数的
- ES6类构造函数参数
- 是否可以在javascript函数参数列表中调用多个函数