2016-12-16 3 views
0

Я хочу, чтобы вернуть значение массива, если его значение содержит определенную строкуФильтр массива по значению в вложенных массивах

var names= [ 
    ["FCFEDA", "Moon Glow"], 
    ["FCFFE7", "China Ivory"], 
    ["FCFFF9", "Ceramic"], 
    ["FD0E35", "Torch Green"], 
    ["FD5B78", "Wild Watermelon"], 
    ["FD7B33", "Crusta Green"] 

]; 
var color_swatches = []; 
var result = $.grep(names, function(v,i) { 
    if(v[1].indexOf("Green") > -1){ 
     return v[0]; 
    } 
}) 
color_swatches.push(result); 
alert(color_swatches); 

приводит

FD0E35, Torch Green,FD7B33, Crusta Green 

Я хочу точно так

["#FD0E35","#FD7B33"] 

Обратите внимание, что результат должен быть заключен в квадратные скобки и с qoutes. Только содержит hex не эквивалентное имя и # добавлено.

Любые идеи?

+0

Альтернативный: если вам не требуется для поддержки некоторых древних браузеров вы можете пропустить Jquery и использовать ванильный JS: результат вара = names.filter (функция (v) { return v [1] .indexOf («Зеленый»)> -1; }). map (function (w) { return "#" + w [0]; }); –

+0

Для этого вам не нужен jQuery. [См. Мой ответ] (http://stackoverflow.com/a/41178944/652669). :) –

ответ

1

.grep() функция «Находит элементы массива, которые удовлетворяют функции фильтра» reference

Другими словами, в вашем коде возвращает «суб-массив» в result.

Попробуйте использовать простой цикл, как это:

var names= [ 
 
     ["FCFEDA", "Moon Glow"], 
 
     ["FCFFE7", "China Ivory"], 
 
     ["FCFFF9", "Ceramic"], 
 
     ["FD0E35", "Torch Green"], 
 
     ["FD5B78", "Wild Watermelon"], 
 
     ["FD7B33", "Crusta Green"] 
 

 
    ]; 
 
    var color_swatches = []; 
 

 
    for(i=0;i<names.length;i++){ 
 
     if(names[i][1].indexOf("Green") > -1){ 
 
      color_swatches.push(names[i][0]); 
 
     } 
 
    } 
 
    //color_swatches.push(result); 
 
    console.log(JSON.stringify(color_swatches));

Уведомление, что я использовал JSON.strignify() только чтобы увидеть содержимое color_swatches массива в консоли.

0

Вы можете использовать функцию карты для преобразования массива color_swatches. В функции карты вы можете выбрать первый элемент и добавить #. Перед предупреждением, добавьте:

color_swatches = $.map(color_swatches[0], function(index, color_swatch) { 
    return "#" + color_swatch[0]; 
}); 
2

Вы можете попробовать что-то вроде этого.

var names= [ 
 
    ["FCFEDA", "Moon Glow"], 
 
    ["FCFFE7", "China Ivory"], 
 
    ["FCFFF9", "Ceramic"], 
 
    ["FD0E35", "Torch Green"], 
 
    ["FD5B78", "Wild Watermelon"], 
 
    ["FD7B33", "Crusta Green"] 
 

 
]; 
 
var color_swatches = []; 
 
names.forEach(item => { 
 
\t if(item[1].indexOf("Green") > -1){ 
 
     color_swatches.push('#' + item[0]); 
 
    } 
 
}); 
 
console.log(color_swatches); 
 
console.log(JSON.stringify(color_swatches));

+0

Мне нужно точно так же ["# FD0E35", "# FD7B33"] –

+0

Где моя разница? – Xzandro

0

Вы можете использовать функции JavaScript Array#filter, Array#map и String#includes:

var names = [ 
 
    ["FCFEDA", "Moon Glow"], 
 
    ["FCFFE7", "China Ivory"], 
 
    ["FCFFF9", "Ceramic"], 
 
    ["FD0E35", "Torch Green"], 
 
    ["FD5B78", "Wild Watermelon"], 
 
    ["FD7B33", "Crusta Green"] 
 
] 
 

 
console.log(names.filter(n => n[1].includes('Green')).map(n => `#${n[0]}`)) 
 

 
// ["#FD0E35","#FD7B33"]