Javascript&;jQuery基于自定义属性将数组推送到对象

Javascript&;jQuery基于自定义属性将数组推送到对象,javascript,jquery,arrays,object,Javascript,Jquery,Arrays,Object,问题 有两个HTML标记,其类如下 <span class=​"keyword" column-name=​"Product Group">​Outdoors</span>​ <span class=​"keyword" column-name=​"Material Code">​10001003​</span>​ <span class=​"keyword" column-name=​"Material Code">​10001000

问题

有两个HTML标记,其类如下

<span class=​"keyword" column-name=​"Product Group">​Outdoors</span>​
<span class=​"keyword" column-name=​"Material Code">​10001003​</span>​
<span class=​"keyword" column-name=​"Material Code">​10001000​</span>​
上面的代码将对象准备为

{
    Material Code: ['Outdoors', '10001003', '10001000']
    Product Group: ['Outdoors', '10001003', '10001000']
}
预期结果

我所期望的对象的结果是

{
    Material Code: ['10001003', '10001000']
    Product Group: ['Outdoors']
}
JS小提琴

这是一个相同的例子-


非常感谢您的帮助

不能使用与每列的值相同的数组。相反,每次遇到新列时都要创建一个新数组,如果
列名
已经存在,则只需将该值附加到现有数组:

$(函数(){
var searchCriteria={};
$('.keyword')。每个(函数(索引,元素){
var col=$(elem.attr('column-name');
var关键字=searchCriteria[col]?searchCriteria[col]:[];
关键字.push($(elem.text());
搜索条件[col]=(关键字);
});
$(“#结果”).text(“结果:+JSON.stringify(searchCriteria));
});

户外
10001003
10001000

当您使用
搜索条件[col]=(关键字)时,它不会复制关键字数组。它只存储指向该数组的指针。所以,如果您在将关键字分配给某个变量后更新关键字,它也会得到更新,因为它们都指向同一个数组。如果要复制阵列,可以在阵列上使用
.slice()
。但在这里它是不需要的

请使用以下代码

var searchCriteria = {};
$('.keyword').each(function(index, elem) {
    col = $(elem).attr('column-name');
    if ( !Array.isArray(searchCriteria[col]) )
        searchCriteria[col] = [];
    searchCriteria[col].push($(elem).text());
});
console.log(searchCriteria);

您可以这样做

var searchCriteria = {};
$('.keyword').each(function(){
   var key = $(this).attr("column-name");
   var value = $('[column-name='+key+']').map(function(){return $(this).text()}).get();
   if(!searchCriteria.hasOwnProperty(key)) searchCriteria[key] = value;
});

那是becoz,你对所有人都使用了相同的更新数组

var searchCriteria = {};
var keyword = [];
$('.keyword').each(function(index, elem) {
    col = $(elem).attr('column-name');
    if( !searchCriteria[col])
         searchCriteria[col] = [];
    searchCriteria[col].push($(elem).text());
});
console.log(searchCriteria);
如果属性不存在,我在这里搜索代码。然后将该索引设为数组。然后你进一步推动元素


我真的建议你重构你的HTML,让它更具语义,它写得真的很糟糕。@GeorgeKatsanos;对HTML需要更改的内容有何反馈?您可以看到现有标记的影响是什么?这非常有效。我有预感数组声明有问题,但不知道是什么。非常感谢你的帮助!使用
map
的聪明方法……但是JS对象没有
push
方法。最后一行应该是
searchCriteria[key]=value@nbrooks谢谢。。推送仅存在于阵列中。。忘了。:)
var searchCriteria = {};
var keyword = [];
$('.keyword').each(function(index, elem) {
    col = $(elem).attr('column-name');
    if( !searchCriteria[col])
         searchCriteria[col] = [];
    searchCriteria[col].push($(elem).text());
});
console.log(searchCriteria);