2015-04-29 2 views
0

У меня есть следующий массив:Найти элемент массива на его основе этого значения (JavaScript)

[ 
0 [product_id, title, description] 
1 [1234, apple, this is just apple] 
2 [2345, pineapple, this is not just apple] 
] 

Этот массив длиной и PRODUCT_ID может варьироваться в зависимости от многих. Мне нужно выбрать элемент на основе его product_id и обновить его title и description.

Есть ли способ сделать это без петли for (например, for -> if product_id = id -> do something), так как я закончил с n^2?

Спасибо за ваше время.

+1

Нет, на самом деле, если вы хотите, чтобы внешний массив был основан на его содержимом, вам нужно повторить итерацию. – adeneo

+1

Почему бы не собрать коллекцию? '[{id: 1, title: 'Foo', description: 'baz'}, ...]' – elclanrs

+3

Одиночное сканирование массива - O (n). –

ответ

1
  • Допущение: product_id является уникальным

Для массива нет никакого другого пути, кроме как петли через все это. Вы должны рассмотреть возможность изменения вашей базы данных в JSON, тогда это станет намного проще.

В вашем примере

var products = [ 
0 [product_id, title, description] 
1 [1234, apple, this is just apple] 
2 [2345, pineapple, this is not just apple] 
] 

становится

var products = { 
    product_id: [product_id, title, description], 
    1234: [1234, apple, this is just apple], 
    2345: [2345, pineapple, this is not just apple] 
} 

Теперь вы можете просто сказать

var select_1234 = products[1234]; 

, чтобы получить продукт 1234.

Если вы должны придерживаться массив a d вам нужно найти продукты несколько раз, подумайте о том, чтобы сделать преобразование в начале вашего приложения, чтобы изменить его на json. Таким образом вы индексировали ваши данные и теперь вы можете снова позвонить

products[1234] 

EDIT

В качестве альтернативы, вы можете создать данные в формате JSON, чтобы связать в массив, например

var productsIndex = { 
    product_id: 0, 
    1234: 1, 
    2345: 2 
} 

Это ссылки на позицию массива, теперь вы можете позвонить по телефону

var find = productsIndex[1234]; 
var select_1234 = products[find]; //This is the original array. 

В качестве дополнительного рассмотрите возможность использования преобразований async для преобразования данных, чтобы он не зависал ни один пользовательский интерфейс. Это может быть сделано с помощью рекурсивного SetTimeout с 0 секунд

var products = { 
    product_id: [product_id, title, description], 
    1234: [1234, apple, this is just apple], 
    2345: [2345, pineapple, this is not just apple] 
} 

var productsIndex = {} 

function recursiveTransform(val){ 
    setTimeout(function(){ 
     productsIndex[products[val].[0]] = val; //products[val].[0] is the product id of each array element 
     if (val != products.length -1) recursiveTransform(val+1); 
    }, 0) 
} 

recursiveTransform(0); 

Делая это, вы не замерзнете ваш пользовательский интерфейс или любую другую операцию, которая может понадобиться для запуска в процессе

  • I не проверяли код, но он должен дать вам идею
+0

Я не могу использовать product_id как id, но спасибо за совет о преобразовании его в JSON - это может действительно работать – user3078775

+0

JSON - это форма данных для строк я не понимаю, как это помогает, но, может быть, это только я? – adeneo

+0

@adeneo JSON - это структура данных ключевых значений. –

0

Невозможно найти нужный вариант. Вам нужно будет создать карту. Эта карта может либо заменить ваш исходный массив в ваших данных, если это имеет смысл, либо вы можете просто создать карту поиска, о которой вы говорите позже.

К счастью, если вы установили fooarray[0] = bar;foomap['uuid'] = bar;, вы можете обновить панель через любую структуру данных, например, fooarray[0][1] = 'new title' или foomap['uuid'][1] = 'new title', и она будет обновляться в обеих структурах, поскольку она передается по ссылке.

редактировать здание на @YangLi:

var products = { 
    product_id: [product_id, title, description], 
    1234: [1234, apple, this is just apple], 
    2345: [2345, pineapple, this is not just apple] 
} 

var productsIndex = {} 

function recursiveTransform(val){ 
    setTimeout(function(){ 
     productsIndex[products[val].[0]] = products[val]; 
     if (val != products.length -1) recursiveTransform(val+1); 
    }, 0) 
} 

recursiveTransform(0); 
0

Использование Array.prototype.find или Array.prototype.findIndex:

[ 
    [2439, 'title', 'description'], 
    [1234, 'apple', 'this is just apple'], 
    [2345, 'pineapple', 'this is not just apple'] 
].findIndex(function(a){return a[0] == 1234}); // returns 1 

[ 
    [2439, 'title', 'description'], 
    [1234, 'apple', 'this is just apple'], 
    [2345, 'pineapple', 'this is not just apple'] 
].find(function(a){return a[0] == 1234}); // returns [1234, 'apple', 'this is just apple'] 

Я бы рекомендовал просто использовать polyfill, а также. См. Ссылки: они предлагают полисы для обоих, чтобы Chrome и IE могли это поддерживать.

+0

Помните, что он не поддерживается в Chrome или IE. –

+0

Просто используйте полисы. – Xufox

+0

Функции стрелки не могут быть заполнены. – Oriol

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