简体   繁体   English

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

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

I've been looking for a solution for this with no luck. 我一直在寻找一个没有运气的解决方案。 I have an JSON object: 我有一个JSON对象:

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

I need a way to manipulate this array with javascript (jquery is allowed), so when "arr[a].dataId" match with the "arr[b].id", take "arr[a]" element and insert into "arr[b]" creating a new array like this: 我需要一种方法来使用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": ""   
}

]; ];

I hope you understand what I'm asking, any help will be appreciated. 希望您能理解我的要求,我们将不胜感激。 Thanks in advance 提前致谢

Try this: 尝试这个:

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

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

This one does move the elements and doesn't manipulate the array while it's iterating over it. 这确实会移动元素,并且在对其进行迭代时不会操纵数组。 Also doesn't need to extend the Array.prototype. 也不需要扩展Array.prototype。 One downside is that you're going to get holes in your array (indexes of elements won't be 0 to length-1), but from what I can see it's not important in your use case. 缺点之一是您将在数组中产生孔(元素的索引不会从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);

Something like this? 像这样吗

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