Обновленная версия проблемы: моя цель - получить индексы элемента этого массива с условием, что подэлемент param_name ключевых параметров будет определять индекс объекта. Например, объект с именем ключа «caller1» должен иметь индекс по умолчанию 0, но поскольку param_name - «caller2», он будет иметь индекс 1; аналогично объект 3 с именем ключа «caller3» примет индекс 0, так как param_name - «caller1». Для объекта 2 с именем ключа 'caller2', поскольку param_name совпадает с именем ключа caller2, он сохранит свой индекс по умолчанию, равный 1.
const array1 = [{
name: 'caller1',
cost: 12,
params:[{param_name:'caller2',apparatus:'fittings'}]
},
{
name: 'caller2',
cost: 2,
params:[{param_name:'caller2',apparatus:'fittings'}]
},
{
name: 'caller3',
cost: 12,
params:[{param_name:'caller1',apparatus:'valves'}]
}
];
const results = []
for (let j=0; j<array1.length;j++){
results[j] = array1[j].findIndex(a => a.name==array1[j].name);
}
console.info(results);
Не уверен, что я понимаю цель, индекс элемента будет j с вашим примером кода, если a является объектом / элементом из array[j]. Таким образом, ваш массив индексов будет просто Object.keys(array1). Если a - это что-то еще (например, другой массив), вам нужно уточнить это и откуда он берется.
Пожалуйста, объясните более подробно, чего вы пытаетесь достичь. Неработающий код - не лучшая замена правильному объяснению
Я хочу получить индексы объектов в массиве с именем array1, используя имя ключа в каждом из объектов в массиве. Итак, массив с именем results будет: results = [0,1,2].
@Isaac Тогда это просто Object.keys(array1)
Следующий вопрос: почему? Какой у вас вариант использования?
@PatrickEvans - хорошая идея, но результатом будет массив строк.
@OriDrori, который в любом случае является индексом массива, поскольку это то, чем являются свойства объекта, если не используются символы и т.д. Никакого упоминания о необходимости примитивного числа не было.
@PatrickEvans Моя цель - использовать фреймворк для избирательного выбора интересующего индекса с помощью условного оператора if. Но я представил только сокращенную версию проблемы; поскольку я могу легко создать условное выражение самостоятельно.
@Isaac - это XyПроблема. Вы просите нас решить странное решение вместо реальной проблемы.
@OriDrori любезно извините меня за двусмысленность в предыдущей версии вопроса, я обновил вопрос, чтобы отразить мою конечную цель.
@PatrickEvans Я обновил вопрос, чтобы отразить мою цель. Прошу прощения за двусмысленность в предыдущей версии вопроса.
@Nina Scholz Я обновил вопрос, чтобы отразить мою цель. Прошу прощения за двусмысленность в предыдущей версии вопроса
@GetOffMyLawn Я обновил вопрос, чтобы отразить мою цель. Прошу прощения за двусмысленность в предыдущей версии вопроса
@charlietfl Я обновил вопрос, чтобы отразить мою цель. Прошу прощения за двусмысленность в предыдущей версии вопроса.
Похоже, что вы действительно хотите отсортировать массив
Итак, ваш результат теперь с обновлением будет [1,1,0]?
@PatrickEvans ты прав
что, если у вас более одного индекса?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете взять Map и сопоставить индексы.
const
array = [{ name: 'caller1', cost: 12, params: [{ param_name: 'caller2', apparatus: 'fittings' }] }, { name: 'caller2', cost: 2, params: [{ param_name: 'caller2', apparatus: 'fittings' }] }, { name: 'caller3', cost: 12, params: [{ param_name: 'caller1', apparatus: 'valves' }] }],
map = new Map(array.map(({ name }, i) => [name, i])),
result = array.map(({ params: [{ param_name }] }) => map.get(param_name));
console.info(result);Вам нужно взять свойство из params и использовать его в качестве параметра поиска для использования при циклическом переходе по основному массиву.
var indexes = array1.map(element => {
var nameToCheck = element.params[0].param_name;
for (let i = 0; i < array1.length; i++) {
if (array1[i].name == nameToCheck) {
return i;
}
}
})
Демо
const array1 = [{
name: 'caller1',
cost: 12,
params: [{
param_name: 'caller2',
apparatus: 'fittings'
}]
},
{
name: 'caller2',
cost: 2,
params: [{
param_name: 'caller2',
apparatus: 'fittings'
}]
},
{
name: 'caller3',
cost: 12,
params: [{
param_name: 'caller1',
apparatus: 'valves'
}]
}
];
var indexes = array1.map(element => {
var nameToCheck = element.params[0].param_name;
for (let i = 0; i < array1.length; i++) {
if (array1[i].name == nameToCheck) {
return i;
}
}
})
console.info(indexes);Обратите внимание: если params на самом деле содержит более 1 элемента, вам нужно будет учесть это и решить, какой из них вам нужно использовать, и соответственно изменить строку element.params[0].param_name;.
пожалуйста, добавьте также желаемый результат. кстати, похоже, что вы хотите взять объект как массив для поиска. это не работает.