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

时间:2013-04-13 17:04:10

标签: javascript jquery

我一直在寻找一个没有运气的解决方案。 我有一个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": ""   
}

];

我希望你理解我的要求,任何帮助都将不胜感激。 提前致谢

3 个答案:

答案 0 :(得分:0)

试试这个:

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/

答案 1 :(得分:0)

这个元素会移动元素,并且在迭代它时不会操纵数组。也不需要扩展Array.prototype。一个缺点是你将在你的数组中得到漏洞(元素的索引不会是0到长度为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);

答案 2 :(得分:-1)

这样的东西?

// 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))