2014-10-22 2 views
2

У меня есть многомерный массив, который выглядит следующим образом:Создать разделенные запятыми строки из многомерного массива

[ 
    Object {href="http://www.somepath.com/car4.png", title="Wheel"}, 
    Object {href="http://www.somepath.com/car.png", title="Top"}, 
    Object {href="http://www.somepath.com/car1.png", title="Side"}, 
    Object {href="http://www.somepath.com/car5.png", title="Saddle"}, 
    Object {href="http://www.somepath.com/car6.png", title="Front"} 
] 

я хотел бы, чтобы петля над этим объектом и извлекать две строки через запятую, один для всех hrefs и один для все названия. Итак, что мне нужно:

hrefs = "'http://www.somepath.com/car4.png', 'http://www.somepath.com/car.png', 'http://www.somepath.com/car1.png', 'http://www.somepath.com/car5.png', 'http://www.somepath.com/car6.png'"; 
titles = "'Wheel', 'Top', 'Side', 'Saddle', 'Front'"; 

Хотя это кажется довольно легким, мне не хватает знаний и не может найти конкретного ответа.

ответ

3

Простая функция, которая использует map, чтобы получить значения в массив, а затем соединить их вверх.

function createString(arr, key) { 
    return arr.map(function (obj) { 
    return "'" + obj[key] + "'"; 
    }).join(', '); 
} 

// pass in the array and the key the values of which 
// you want to 'stringify' 
var hrefs = createString(arr, 'href'); 
var titles = createString(arr, 'title'); 

DEMO

+0

@ Энди согласился - это явно просто «отформатированное» представление объекта, а не фактическое JS. – Alnitak

+0

@ Andy ok: меня смутили теги csv и многомерных массивов, которые в этом случае вводят в заблуждение –

+1

Я выбрал это как правильный ответ, поскольку он дает мне именно то, что я хотел по-чистым. – Solide

0

Вы можете сделать это:

var hrefs = [], 
    titles = []; 

data.forEach(function(obj) { 
    hrefs.push("'" + obj.href + "'"); 
    titles.push("'" + obj.title + "'"); 
}); 

hrefs = hrefs.join(', '); 
titles = titles.join(', '); 
+0

Только быстрое примечание - 'forEach' поддерживается в IE9 и выше, в случае, если кто-нибудь необходимо поддерживать предыдущие версии. – vlaz

+0

[Вот полиполк] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach). – Andy

+0

@ Vld-хотя цикл for прост, часто быстрее и может быть менее типом. – RobG

0
var data = [ 
    {href:"http://www.somepath.com/car4.png", title:"Wheel"}, 
    {href:"http://www.somepath.com/car.png", title:"Top"}, 
    {href:"http://www.somepath.com/car1.png", title:"Side"}, 
    {href:"http://www.somepath.com/car5.png", title:"Saddle"}, 
    {href:"http://www.somepath.com/car6.png", title:"Front"} 
], 
href = [], 
title = [], 
dataL = data.length; 

for (i = 0; i < dataL; i++){ 
    href.push (data[i]['href']); 
    title.push (data[i]['title']); 
} 

href = href.join(","); 
title = title.join(","); 
0

Каноническая функция, чтобы сделать массив на основе содержимого другого массива map. Вы можете объединить, что с join сделать необходимую строку:

var hrefs = data.map(function(d) { return "'" + d.href + "'" }).join(', '); 
var titles = data.map(function(d) { return "'" d.title + "'" }).join(', '); 

Обратите внимание, что это будет не в состоянии произвести правильный CSV, если есть какие-либо одинарные кавычки, знаки внутри полей. Решение заключалось бы в предоставлении более строгой функции цитирования. Следуя обычной конвенции, что кавычки внутри строки должны быть в два раза вверх:

function enquote(v) { 
    return "'" + v.replace(/'/g, "''") + "'"; 
} 

с использованием:

var titles = data.map(function(d) { return enquote(d.title) }).join(', '); 
+0

downvoter - поясните пожалуйста! – Alnitak

+0

Этот ответ выглядит хорошо. Почему downvote? позаботьтесь об этом, пожалуйста. –

+0

Я предполагаю, что это потому, что OP не хочет иметь массив. OP хочет строку с котируемыми элементами. – Andy

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