2016-11-11 5 views
0

Я использую функцию javascript reverse(), чтобы отменить объекты, хранящиеся в локальном массиве хранения. Но я пытаюсь вступить в брак с исходным индексом с новым упорядоченным массивом.Найти исходный индекс обратного массива

var fruits = ["Banana", "Orange", "Apple", "Mango"]; 
fruits.indexOf("Apple"); //2 
var fruitsReversed = fruits.reverse(); 
fruitsReversed.indexOf("Apple"); //1 -> I want to know that it used to be 2 

Есть ли простой способ сделать это? Мой реальный случай немного сложнее, так как исходная строка в формате JSON:

var data = {"info":[{"name":"Max"},{"name":"Alex},{"name":"Sam"},{"name":"Chris"}]} 

... но я не знаю, если это будет иметь значение.

Обновление: Я получил эту работу, используя, используя немного работы вокруг:

var fruitsLength = fruitsReversed.length-1; //3. subtract one because the first index is 0, not 1 
var fruitIndex = fruitsLength - fruitsReversed.indexOf("Apple"); //2 (3-1) 

Таким образом, хотя это работает, я думаю, что должно быть чище путь ...

+0

Я собирался предложить то, что вы сделали там, принимая длину и вычитанием 1, чтобы сделать его нулевым индексируется, а затем вычитая новое положение. Это не кажется настолько плохим решением, и если вы обнаружите, что занимаетесь подобным делом в нескольких местах, абстрагирование его до функции будет просто замечательным. – Dymos

+0

Можете ли вы добавить дополнительную информацию о том, зачем нужен этот индекс? Если вы имеете дело со списком объектов, не можете ли вы сохранить ссылку на сам объект, не заботитесь об индексе массива? –

+1

Спасибо за поддержку @Dymos – Brad

ответ

0

Сначала в вашем примере fruits === fruitsReversed. Ниже я расскажу о том, как происходит reverse().

Вы упомянули в комментариях, что вам нужно отобразить обратную версию вашего массива, за исключением того, что вы хотите отредактировать оригинал. Если ваш массив содержит множество объектов, вам вообще не нужно беспокоиться об индексах. Рассмотрим этот массив:

var arr = [{ val: 1 }, { val: 2 }]; 

Если обратить этот массив, он все равно будет содержать оригинальные объекты, а только ссылка, какие изменения. Это означает, что если вам понадобится изменить свойства массива (например, val), просто передайте ссылки на фактические объекты. Например:

var arr = [{ val: 1 }, { val: 2 }]; 
var anObject = arr[0]; 
arr.reverse(); 
// this changes the original objects value 
anObject.val = 5; 
// this prints 5 
console.log(arr[1].val); 

Имея это в виду, на ваш взгляд, просто передать в индекс элемента в обратном массиве. Лично, однако, я бы использовал библиотеку привязки данных, такую ​​как угловые или реагирующие, и просто изменял сами элементы, отделяя их от любого упорядочения массива.


docs также объяснить, как reverse() изменения в месте.

Метод reverse() меняет массив на место. Первый элемент массива становится последним, а последний элемент массива становится первым.

Это означает, что фактический исходный массив изменен, он не копируется перед обращением. Вы не должны использовать то, что возвращается, и можете просто позвонить arr.reverse().

0

myArray=[{"name":"Max"},{"name":"Alex"},{"name":"Sam"},{"name":"Chris"}]; 
 
pos = myArray.map(function(e) { return e.name; }).reverse().indexOf('Alex'); 
 
console.log("position before reverse="+pos);

0

Я предлагаю использовать уникальный идентификатор в объекте для доступа к объекту без необходимости знать индекс массива.

Затем вы можете изменить порядок массива и получить доступ через хеш-таблицу.

var data = { info: [{ name: "Max" }, { name: "Alex" }, { name: "Sam" },{ name: "Chris" }] }, 
 
    hash = Object.create(null); 
 

 
data.info.forEach(function (a) { 
 
    hash[a.name] = a; 
 
}); 
 

 
console.log(hash.Max); 
 
console.log(hash["Sam"]); 
 
console.log(hash);
.as-console-wrapper { max-height: 100% !important; top: 0; }