2016-11-30 4 views
0

У меня есть объект, который содержит список уникальных имен столбцов:Создание объектов со значениями из массива

["heading", "startDate", "finishDate"] 

Я возвращающий набор данных XML, который выглядит, как похожее на это так:

<z:row ows_heading='Header' ows_startDate='1/1/2016' ows_finishDate='1/11/2016' ows_Description='Ignore me'/> 
<z:row ows_heading='Header' ows_startDate='2/3/2016' ows_finishDate='2/12/2016' ows_Description='Ignore me'/> 

Как мне пройти через уникальный объект имени столбца, чтобы получить имя столбца, добавить к нему «ows_», а затем найти полученное значение и добавить его обратно к объекту, чтобы конечный результат был примерно таким:

["heading": "Header", "startDate": "1/1/2016", "finishDate": "1/11/2016"] 

EDIT: Текущий блок кода:

var a=[];var obj={}; 
     $(r).find("[nodeName=z:row]").each(function() 
     { 
      $.each(uniqHeaderVals, function(key, value) { 
       var thisVal = $(this).attr("ows_"+value); 
       obj.value = thisVal; 
      }); 

      a.push(obj); 
     }); 
     console.log(a); 
+0

Пытались ли вы что-нибудь? Вы спрашиваете, как пройти через массив? –

ответ

1

Опираясь на @ScottMarcus почти правильный ответ

var arry = ["heading", "startDate", "finishDate"]; 
 

 
var elems = document.getElementsByTagName("z:row"); 
 

 
var resultArry = [].map.call(elems, function(elem) { 
 
    // For each element, create an object 
 
    return arry.reduce(function(result, attr) { 
 
    result[attr] = elem.getAttribute('ows_' + attr); 
 
    return result; 
 
    }, {}); 
 
}); 
 
console.log(resultArry);
<z:row ows_heading='Header' ows_startDate='1/1/2016' ows_finishDate='1/11/2016' ows_Description='Ignore me'/> 
 
<z:row ows_startDate='2/3/2016' ows_finishDate='2/12/2016' ows_Description='Ignore me' ows_heading='Header' />

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

0

Просто перебрать элементы и для каждого цикла через свои атрибуты и извлекать значения атрибутов?

Ваш результат нужно будет массив объектов, хотя:

[ 
    { "heading": "Header", "startDate": "1/1/2016", "finishDate": "1/11/2016" }, 
    { "heading": "Header", "startDate": "2/3/2016", "finishDate": "2/12/2016" } 
] 

Так как это: ["heading": "Header", "startDate": "1/1/2016", "finishDate": "1/11/2016"] не является допустимым структура.

var arry = ["heading", "startDate", "finishDate"]; 
 

 
var elems = document.getElementsByTagName("z:row"); 
 

 
var resultArry = []; 
 

 
// Loop through the XML elements 
 
for(var i = 0; i < elems.length; ++i){ 
 
    
 
    // For each element, create an object 
 
    var obj = {}; 
 
    
 
    // Loop through the element's attributes 
 
    for(var x = 0; x < elems[i].attributes.length - 1; ++x){ 
 
    // For each attribute, create a property value 
 
    obj[arry[x]] = elems[i].attributes[x].value; 
 
    } 
 
    resultArry.push(obj); 
 
} 
 

 
console.log(resultArry);
<z:row ows_heading='Header' ows_startDate='1/1/2016' ows_finishDate='1/11/2016' ows_Description='Ignore me'/> 
 
<z:row ows_heading='Header' ows_startDate='2/3/2016' ows_finishDate='2/12/2016' ows_Description='Ignore me'/>

+0

ваш код ошибочен, если порядок атрибутов в строке 'z: row' отличается от порядка в' arry' –

+0

Правда, но поскольку OP рассказал нам, что такое схема XML, мой код не является недостатком. –

+0

схема не диктует порядок атрибутов –

0

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

var uniqHeaderVals = ["heading", "startDate", "finishDate"] 
 

 
var xml = "<z:row ows_heading='Header' ows_startDate='1/1/2016' ows_finishDate='1/11/2016' ows_Description='Ignore me'/>" 
 
    + "<z:row ows_heading='Header' ows_startDate='2/3/2016' ows_finishDate='2/12/2016' ows_Description='Ignore me'/>"; 
 

 
var r = $('<content>' + xml + '</content>'); // valid XML needs a single root 
 

 
var a = r.find('z\\:row').get().map(function (node) { 
 
    return uniqHeaderVals.reduce(function (o, title) { 
 
     var attr = $(node).attr('ows_' + title); 
 
     if (attr) o[title] = attr; 
 
     return o; 
 
    }, {}) 
 
}); 
 

 
console.log(a);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

0

const XML_INPUT = ` 
 
<z:row ows_heading='Header' ows_startDate='1/1/2016' ows_finishDate='1/11/2016' ows_Description='Ignore me'/> 
 
<z:row ows_heading='Header' ows_startDate='2/3/2016' ows_finishDate='2/12/2016' ows_Description='Ignore me'/>`; 
 
const COLUMNS = ['heading', 'startDate', 'finishDate']; 
 

 
console.log(children(toDom(XML_INPUT)).reduce(toRow, [])); 
 

 
function toDom(str) { 
 
    var tmp = document.createElement('div'); 
 
    tmp.innerHTML = str; 
 
    return tmp; 
 
} 
 

 
function children(nodes) { 
 
    return [...nodes.querySelectorAll('*')]; 
 
} 
 

 
function toRow(p, node) {  
 
    p.push(COLUMNS.reduce((p, c) => { 
 
     p[c] = attr(node, c); 
 
     return p; 
 
    }, {})); 
 
    return p; 
 
} 
 

 
function attr(node, name) { 
 
    return node.getAttribute('ows_' + name); 
 
}
.as-console-wrapper { max-height: 100% !important; top: 0; }

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