Как я могу найти и отсортировать индексы элементов объекта в массиве в JavaScript - PullRequest
0 голосов
/ 03 ноября 2018

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

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Вам нужно взять свойство из 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.log(indexes);

Обратите внимание, что если params на самом деле содержит более 1 элемента, вам необходимо учесть это и решить, какой из них вам нужно использовать, и соответственно изменить строку element.params[0].param_name;

0 голосов
/ 03 ноября 2018

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