Как найти и отсортировать индексы элементов объекта в массиве в javascript

Обновленная версия проблемы: моя цель - получить индексы элемента этого массива с условием, что подэлемент 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);

пожалуйста, добавьте также желаемый результат. кстати, похоже, что вы хотите взять объект как массив для поиска. это не работает.

Nina Scholz 03.11.2018 20:59

Не уверен, что я понимаю цель, индекс элемента будет j с вашим примером кода, если a является объектом / элементом из array[j]. Таким образом, ваш массив индексов будет просто Object.keys(array1). Если a - это что-то еще (например, другой массив), вам нужно уточнить это и откуда он берется.

Patrick Evans 03.11.2018 21:03

Пожалуйста, объясните более подробно, чего вы пытаетесь достичь. Неработающий код - не лучшая замена правильному объяснению

charlietfl 03.11.2018 21:05

Я хочу получить индексы объектов в массиве с именем array1, используя имя ключа в каждом из объектов в массиве. Итак, массив с именем results будет: results = [0,1,2].

Isaac 03.11.2018 21:07

@Isaac Тогда это просто Object.keys(array1)

Patrick Evans 03.11.2018 21:08

Следующий вопрос: почему? Какой у вас вариант использования?

charlietfl 03.11.2018 21:08

@PatrickEvans - хорошая идея, но результатом будет массив строк.

Ori Drori 03.11.2018 21:10

@OriDrori, который в любом случае является индексом массива, поскольку это то, чем являются свойства объекта, если не используются символы и т.д. Никакого упоминания о необходимости примитивного числа не было.

Patrick Evans 03.11.2018 21:11

@PatrickEvans Моя цель - использовать фреймворк для избирательного выбора интересующего индекса с помощью условного оператора if. Но я представил только сокращенную версию проблемы; поскольку я могу легко создать условное выражение самостоятельно.

Isaac 03.11.2018 21:13

@Isaac - это XyПроблема. Вы просите нас решить странное решение вместо реальной проблемы.

Ori Drori 03.11.2018 21:15

@OriDrori любезно извините меня за двусмысленность в предыдущей версии вопроса, я обновил вопрос, чтобы отразить мою конечную цель.

Isaac 03.11.2018 21:39

@PatrickEvans Я обновил вопрос, чтобы отразить мою цель. Прошу прощения за двусмысленность в предыдущей версии вопроса.

Isaac 03.11.2018 21:41

@Nina Scholz Я обновил вопрос, чтобы отразить мою цель. Прошу прощения за двусмысленность в предыдущей версии вопроса

Isaac 03.11.2018 21:41

@GetOffMyLawn Я обновил вопрос, чтобы отразить мою цель. Прошу прощения за двусмысленность в предыдущей версии вопроса

Isaac 03.11.2018 21:44

@charlietfl Я обновил вопрос, чтобы отразить мою цель. Прошу прощения за двусмысленность в предыдущей версии вопроса.

Isaac 03.11.2018 21:44

Похоже, что вы действительно хотите отсортировать массив

charlietfl 03.11.2018 21:47

Итак, ваш результат теперь с обновлением будет [1,1,0]?

Patrick Evans 03.11.2018 21:49

@PatrickEvans ты прав

Isaac 03.11.2018 21:51

что, если у вас более одного индекса?

Nina Scholz 03.11.2018 22:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
19
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете взять 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;.

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