繁体   English   中英

将元素插入同一数组中的另一个元素内

[英]Insert element inside another element in the same array

我一直在寻找一个没有运气的解决方案。 我有一个JSON对象:

arr = [
{
    "id": "1",
    "dataId" : "", 
    "rel": ""
}, 
{
    "id": "2",
    "dataId" : "", 
    "rel": ""
}, 
{
    "id": "3", 
    "dataId" : "", 
    "rel": ""   
}, 
{
    "id": "4",
    "dataId" : "1", 
    "rel": ""   
}];

我需要一种方法来使用javascript处理此数组(允许使用jquery),因此,当“ arr [a] .dataId”与“ arr [b] .id”匹配时,采用“ arr [a]”元素并插入“ arr [b]“创建一个新的数组,如下所示:

newArr = [
{
    "id": "1",
    "dataId" : "", 
    "rel" : [
        {
            "id": "4",
            "dataId" : "1"  
        }
    ]
}, 
{
    "id": "2",
    "dataId" : "", 
    "rel": ""
}, 
{
    "id": "3", 
    "dataId" : "", 
    "rel": ""   
}

];

希望您能理解我的要求,我们将不胜感激。 提前致谢

尝试这个:

var arr = [
{
    "id": "1",
    "dataId" : "", 
    "rel": ""
}, 
{
    "id": "2",
    "dataId" : "", 
    "rel": ""
}, 
{
    "id": "3", 
    "dataId" : "", 
    "rel": ""   
}, 
{
    "id": "4",
    "dataId" : "1", 
    "rel": ""   
}];
$(arr).each(function(index,value){
     if(value.dataId)
     {
         $(arr).each(function(ind,val){
             if(val.id==value.dataId)
             {
                 if(val.rel)
                 {
                     val.rel.push({"id":value.id,"dataId":value.dataId});
                 }
                 else
                 {                   
                     val.rel=[{"id":value.id,"dataId":value.dataId}];                     
                 }
             }
         });
     }
});
console.log(arr);

小提琴 http://jsfiddle.net/7g23B/

这确实会移动元素,并且在对其进行迭代时不会操纵数组。 也不需要扩展Array.prototype。 缺点之一是您将在数组中产生孔(元素的索引不会从0到length-1的索引),但是据我所知,这在您的用例中并不重要。

var arr = [
{
    "id": "1",
    "dataId" : "", 
    "rel": ""
}, 
{
    "id": "2",
    "dataId" : "3", 
    "rel": ""
}, 
{
    "id": "3", 
    "dataId" : "", 
    "rel": ""   
}, 
{
    "id": "4",
    "dataId" : "1", 
    "rel": ""   
}];

var indexesToMoveMap = {};

$.each(arr, function(outerIndex, outerElem) {
    if (outerElem.dataId) { 
        $.each(arr, function(innerIndex, innerElem) {
            if (innerElem.id === outerElem.dataId) {
                indexesToMoveMap[outerIndex] = innerIndex;
            }
        });
    }
});

$.each(indexesToMoveMap, function(indexToMove, indexToMoveTo) {
    arr[indexToMoveTo].rel = arr[indexToMoveTo].rel || [];
    arr[indexToMoveTo].rel.push(arr[indexToMove]);
    delete arr[indexToMove];
});

console.log(arr);

像这样吗

// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.push.apply(this, rest);
};

var arr = [
{
    "id": "1",
    "dataId" : "", 
    "rel": []
}, 
{
    "id": "2",
    "dataId" : "", 
    "rel": []
}, 
{
    "id": "3", 
    "dataId" : "", 
    "rel": []   
}, 
{
    "id": "4",
    "dataId" : "1", 
    "rel": []   
}];

var index = 0;
for ( var m = 0; m < arr.length; m++ ) {
    for ( var i = 0; i < arr.length; i++ ) {

       if ( arr[index].id === arr[i].dataId ) {
             arr[index].rel.push (arr[i]);  
             arr.remove(i);
       }

    }
    index++;
}

console.log(JSON.stringify(arr, null, 4))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM