Javascript findIndex для повторяющихся значений - PullRequest
1 голос
/ 20 мая 2019

JavaScript findIndex возвращает самый первый найденный индекс в случае повторяющихся значений

const arr = [{a: 10, b: 20, c: 30},{a: 15, b: 25, c: 32},{a: 10, b: 23, c: 350}]
const index = arr.findIndex(m => m.a === 10)
console.log(index);

Приведенный выше код будет возвращать только индекс 0.

Что я должен сделать, чтобы получить индекс 2.

Ответы [ 8 ]

2 голосов
/ 20 мая 2019

Вы можете filter keys массива следующим образом:

const arr = [{a: 10, b: 20, c: 30},{a: 15, b: 25, c: 32},{a: 10, b: 23, c: 350}]
const indices = [...arr.keys()].filter(i => arr[i].a === 10)
console.log(indices)

Или просто используйте for цикл

const arr = [{a: 10, b: 20, c: 30},{a: 15, b: 25, c: 32},{a: 10, b: 23, c: 350}]
const output = [];

for (let i = 0; i < arr.length; i++) {
  if (arr[i].a === 10)
    output.push(i)
}

console.log(output)
0 голосов
/ 20 мая 2019

Если вы хотите функцию, которая работает напрямую с массивом, добавьте это в Array.prototype

Array.prototype.findAllIndexes = function(iteratee){
    var resultArray = [];
    this.forEach(function(element) {
        var validated = iteratee.call(this, element);
        if(validated) {
            resultArray.push(element);
        }
    });
    return resultArray;
}

Затем вы можете использовать его как угодно с объектом массива

(пожалуйста, обрабатывайте ваши угловые случаи на основе используемого вами типа данных)

const arr = [{a: 10, b: 20, c: 30},{a: 15, b: 25, c: 32},{a: 10, b: 23, c: 350}]
const index = arr.findAllIndexes(m => m.a === 10)
console.log(index);

Вы можете использовать некоторые вспомогательные библиотеки для таких вещей, как lodash.js, вы можете включить их в свой проект.

0 голосов
/ 20 мая 2019

Вы можете попробовать вот так:

const arr = [{a: 10, b: 20, c: 30},{a: 15, b: 25, c: 32},{a: 10, b: 23, c: 350}];

const indices = arr.map((x, index) => {
	if (x.a === 10) {
		return index;
	}
})
.filter(x => x !== undefined);

console.log(indices);
0 голосов
/ 20 мая 2019

Вы можете просто перебрать массив и вставить индекс соответствия в новый массив.

const arr = [{a: 10, b: 20, c: 30},{a: 15, b: 25, c: 32},{a: 10, b: 23, c: 350}]
let p = []
arr.forEach((ele,index)=> ele.a===10 ? p.push(index) : '')
console.log(p)
0 голосов
/ 20 мая 2019

Вы можете отобразить индексы найденных предметов и отфильтровать только действительные индексы.

const
    array = [{ a: 10, b: 20, c: 30 }, { a: 15, b: 25, c: 32 }, { a: 10, b: 23, c: 350 }],
    indices = array
        .map((m, i) => m.a === 10 ? i : -1)
        .filter(i => i != -1);

console.log(indices);
0 голосов
/ 20 мая 2019

Используйте map и filter:

const arr = [{a: 10, b: 20, c: 30},{a: 15, b: 25, c: 32},{a: 10, b: 23, c: 350}];
const res = arr.map(({ a }, i) => a == 10 ? i : "").filter(String);
console.log(res);
0 голосов
/ 20 мая 2019

Вы можете использовать Array.reduce для зацикливания вашего arr и возврата всех индексов

Одна строка :

const arr = [{
  a: 10,
  b: 20,
  c: 30,
}, {
  a: 15,
  b: 25,
  c: 32,
}, {
  a: 10,
  b: 23,
  c: 350,
}]

// Value to check for
const v = 10;

// we loop on every entry of the arr
// we start with an empty array and look if the entries
// contains the value 10, if they do, we push the index of the
// entry in the array that was empty
//
// we do that for every entry of arr, when we treat all, we return
// the list of matching entries
const idx = arr.reduce((tmp, x, xi) => (x.a === v ? [...tmp, xi] : tmp), []);

console.log(idx);

Объяснено :

const arr = [{
  a: 10,
  b: 20,
  c: 30,
}, {
  a: 15,
  b: 25,
  c: 32,
}, {
  a: 10,
  b: 23,
  c: 350,
}]

const valToCheck = 10;

const indexes = arr.reduce((tmp, x, xi) => {
  if (x.a === valToCheck) {
    tmp.push(xi);
  }

  return tmp;
}, []);

console.log(indexes);
0 голосов
/ 20 мая 2019
arr.reduce((result, current, index) => {
   return result.concat(current.a == 10 ? [index]: [])
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...