2012-05-01 3 views
0

У меня есть массив ints, который называется SelectedItems. У меня есть другой массив, содержащий объекты, которые называются AvailableItems, и это было проанализировано с помощью json; эти объекты Item имеют свойства {ContainerID, ContainerName, ItemID, ItemName}.javascript преобразование массива из ints в массив объектов

Я хочу, чтобы преобразовать SelectedItems из массива целых чисел в массив Items, где каждый ItemID заменяется на Item объекте, который соответствует ItemID в AvailableItems. Каждый ItemID в SelectedItems уникален.

Я начал с 2-мя петлями: одно петлями через каждый элемент SelectedItems но тогда я окажусь пробегаем по AvailableItems каждый раз, чтобы найти соответствующий ItemID с ключами объекта мне нужно скопировать в SelectedItems.

Итак, в основном я построил, казалось бы, очень неэффективный цикл. Мне было интересно, есть ли лучший способ сделать это, избегая повторного цикла внутри цикла?

Образец данных:

Для AvailableItems, у вас есть

{ 
    ContainerID: i, 
    ContainerName: 'SomeName', 
    ItemID: j, 
    ItemName: 'SomeOtherName' 
} 

с может быть 1000 объектов, а затем SelectedItems является массив Интс

[23,43,64,34...] 

Спасибо.

+0

Вы можете отфильтровать второй массив в соответствии с первым, а затем вернуть результат с такими функциями, как Array.filter, вы можете проверить, содержится ли элемент в первом с Array.indexOf, который должен быть> -1 каждый раз, когда условие истинно. – mpm

+0

@camus: хорошо, ваш комментарий дал идею о том, как его переделать лучше. Я копирую массив AvailableItems с помощью jquery.extend в новый массив с именем CandidateItems, а затем прохожу через этот массив: я проверяю, есть ли ItemID каждого элемента в SelectedItems с $ .InArray, и если я не удаляю этот элемент. В конце цикла я назначаю CandidateArray для SelectedItems и voila – frenchie

ответ

1

Если вы можете получить произвольное AvailableItem без перебора по всему массиву, просто обратившись к нему по его идентификатору (если у вас есть индексный массив, где идентификаторы являются индексами), вы можете пройти через SelectedItems и проверить, он существует в AvailableItems, и если он делает это, вы конвертируете SelecteItem в объект и добавляете его в некоторый временный массив для последующего использования.

+0

нормально, ваш ответ дал идею о том, как его переделать лучше. Я копирую массив AvailableItems с помощью jquery.extend в новый массив с именем CandidateItems, а затем прохожу через этот массив: я проверяю, находится ли ItemID каждого элемента в SelectedItems с InArray, и если я не удаляю этот элемент. В конце цикла я назначаю CandidateArray для SelectedItems и voila. – frenchie

2

Вы можете поместить каждый объект в числовой массив AvailableItems по индексу, который соответствует его ItemID.

Знаете ли вы, что предмет с номером ItemID из 5 находится на AvailableItems[5] вместо того, чтобы пройти его и найти.

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


UPDATE:

После быстрого поиска и чтение this answer, это выглядит как наличие пробелов между индексами не будет тратить кучу памяти. Однако это повлияет на результат проверки AvailableItems.length. Если у вас есть массив с одной записью, но индекс этой записи равен 500, тогда AvailableItems.length вернет 501, хотя в массиве есть только одна запись.

До тех пор, пока вам не нужно использовать функцию length, это решение должно работать на вас.

+0

ОК, я понял, как его переделать. Я копирую массив AvailableItems с помощью jquery.extend в новый массив с именем CandidateItems, а затем прохожу через этот массив: я проверяю, находится ли ItemID каждого элемента в SelectedItems с InArray, и если я не удаляю этот элемент. В конце цикла я назначаю CandidateArray выбранным элементам и вуале – frenchie

Смежные вопросы