gpt4 book ai didi

javascript - 如何在 JavaScript 中描述函数参数的位置

转载 作者:行者123 更新时间:2023-12-02 15:18:02 32 4
gpt4 key购买 nike

我不确定我是否在我的主题中很好地描述了这个问题。我不确定“位置”是否是描述深度嵌套在对象内的参数位置的正确方法。

下面是我创建的一个函数,它搜索对象数组并返回具有特定值属性的第一个对象的索引。

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 中导航对象的方式,使用句号作为分隔符将其拆分为一个数组,然后循环遍历每个项目以导航对象。

这感觉很奇怪,似乎应该有更好的方法来做到这一点。我还没有找到任何其他尝试做类似事情的函数示例。这种方法(即传递字符串、分解和循环)是导航嵌套对象的最佳方法吗?

最佳答案

I have not been able to find any other examples of functions trying to do a similar thing.

其实这样的例子还有很多,看看Accessing nested JavaScript objects with string keyConvert JavaScript string in dot notation into an object reference .

Is this method, i.e. pass string, explode and loop, the best way to navigate nested objects?

没有。循环对于访问嵌套属性非常必要,但不应将路径作为字符串传递。让您的函数立即获取数组。这更加方便和通用:

  • 您没有责任(正确)解析/分解字符串
  • 通常情况下,调用者也是通用的并且已经使用了数组
  • 无需担心边缘情况(例如数组索引、符号键或包含点的属性名称)

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您根本不需要辅助方法,但只需调用

people.findIndex(function(item) { return item.names.first === 'Jane'; })

关于javascript - 如何在 JavaScript 中描述函数参数的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34309343/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com