Простой способ найти номер позиции в данном объекте для значения

Так я делаю, например:

$OUs = Get-ADOrganizationalUnit <blah>

Я хочу найти позицию в массиве для «Тест» (т. е. я хочу провести некоторое тестирование, где я могу сослаться на позицию в array, в которой находится $OU.Name -eq "Test", например $OUs[6]).

Я мог бы сделать что-то вроде:

$number = 0
foreach ($OU in $OUs)
{
    "$($OU.name) - $number"
    $number += 1
}

Есть ли более быстрый и простой способ?

Сначала я неправильно понял, о чем вы спрашиваете, поэтому удалил исходные ответы. Надеюсь, моя третья попытка — это то, что вы ищете.

emanresu 03.07.2024 14:03

Почему важно получить индекс?

Santiago Squarzon 03.07.2024 14:51

Что произойдет, если критериям соответствуют несколько подразделений? Вы хотите, чтобы решение нашло их все или только первое или последнее?

Mathias R. Jessen 03.07.2024 15:10

@emanresu, я отредактировал свой вопрос, чтобы добавить немного деталей, так что, вероятно, это моя вина, извините :-).

Badger 03.07.2024 15:21

@SantiagoSquarzon, чтобы я мог легко проводить тестирование, например. Если у меня есть $OU и цикл foreach ($OU в $OUs) для выполнения <чего-то>, а в $OU 40 строк/элементов, я хочу иметь возможность сказать $OU = $OUs[5] поскольку я знаю, что, например, $OU вызовет ошибку. Хотя даже для меня это звучит немного искаженно :-)

Badger 03.07.2024 15:24

@Badger Для этого вам не нужно знать индекс — просто отфильтруйте список и затем работайте только с соответствующими подразделениями: $OUs |Where-Object Name -eq Test |ForEach-Object { <# $_ now references an OU with name 'Test', work with it in here #> }

Mathias R. Jessen 03.07.2024 15:28

@MathiasR.Jessen ах, я неправильно сформулировал свой вопрос. Ответ ниже ответил на мой вопрос, но на самом деле это ответ на вопрос, который я ДОЛЖЕН был задать! Меня раздражает, что я сам об этом не подумал, но да, $OU = $OUs | Where-Object {$_.Name -eq "test"} дал мне то, что я хотел (но не просил должным образом). Спасибо!!

Badger 03.07.2024 15:37

@MathiasR.Jessen Это так забавно, на самом деле это первый ответ, который я опубликовал, но затем я удалил его, потому что думал, что OP действительно нужно знать индекс по определенной причине.

emanresu 03.07.2024 16:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы получить только индекс объекта со свойством name, значение которого равно test, вы можете сделать это в одной строке следующим образом:

$object1 = New-Object psobject -Property @{'Name'='test'}
$object2 = New-Object psobject -Property @{'Name'='nope'}
$myArray = @($object1, $object2)
$testIndex = $myArray.IndexOf(($myArray.Where({$_.name -eq 'test'}))[0])

В приведенном выше подходе, если объекта с таким значением нет, он вернет -1. Также обратите внимание, что если критериям соответствуют несколько объектов, будет возвращен только индекс первого возвращенного элемента. Это связано с взятием элемента с индексом 0 из массива, возвращаемого методом Where.

Или это:

    $object1 = New-Object psobject -Property @{'Name'='test'}
    $object2 = New-Object psobject -Property @{'Name'='nope'}
    $myArray = @($object1, $object2)
    #this will just output the index to the terminal
    $myArray.ForEach({
        if ($_.name -eq 'test'){
            $myArray.IndexOf($_)
        }
    })
    #you can capture the index instead, like this:
    $testIndex = $myArray.ForEach({
       if ($_.name -eq 'test'){
           $myArray.IndexOf($_)
       }
   })

Это также дает -1, когда совпадений нет.

Отлично, спасибо! $myArray.IndexOf(($myArray.Where({$_.name -eq 'test'}))[0]) сработал для меня как шарм.

Badger 03.07.2024 15:28

Другие вопросы по теме