2017-02-02 8 views
2

オブジェクトのidプロパティが31になる別の配列の中にネストされた配列サブブランド内のオブジェクトを削除するにはどうすればいいですか?そのサブバンドを削除せずに親配列を返します。JS:ネストされた配列からオブジェクトを削除して親の配列を返します

配列は次のとおりです。

[ 
    { 
    "id": 10, 
    "name": "Parent Brand 1", 
    "parent": null, 
    "author": 1, 
    "deleted_at": null, 
    "created_at": "2017-02-02 09:55:51", 
    "updated_at": "2017-02-02 09:55:51", 
    "subBrands": [ 
     { 
     "id": 31, 
     "name": "Sub Brand 6", 
     "parent": 10, 
     "author": 1, 
     "deleted_at": null, 
     "created_at": "2017-02-02 11:24:49", 
     "updated_at": "2017-02-02 11:42:02" 
     }, 
     { 
     "id": 32, 
     "name": "Sub Brand 7", 
     "parent": 10, 
     "author": 1, 
     "deleted_at": null, 
     "created_at": "2017-02-02 11:24:57", 
     "updated_at": "2017-02-02 11:42:18" 
     }, 
     { 
     "id": 33, 
     "name": "Sub Brand 8", 
     "parent": 10, 
     "author": 1, 
     "deleted_at": null, 
     "created_at": "2017-02-02 11:25:04", 
     "updated_at": "2017-02-02 11:42:34" 
     }, 
     { 
     "id": 34, 
     "name": "Sub Brand 9", 
     "parent": 10, 
     "author": 1, 
     "deleted_at": null, 
     "created_at": "2017-02-02 11:25:39", 
     "updated_at": "2017-02-02 11:42:43" 
     }, 
     { 
     "id": 35, 
     "name": "Sub Brand 10", 
     "parent": 10, 
     "author": 1, 
     "deleted_at": null, 
     "created_at": "2017-02-02 11:25:46", 
     "updated_at": "2017-02-02 11:42:52" 
     }, 
     { 
     "id": 36, 
     "name": "Sub Brand 4", 
     "parent": 10, 
     "author": 1, 
     "deleted_at": null, 
     "created_at": "2017-02-02 11:43:53", 
     "updated_at": "2017-02-02 11:43:53" 
     } 
    ] 
    }, 
    { 
    "id": 12, 
    "name": "Parent Brand 2", 
    "parent": null, 
    "author": 1, 
    "deleted_at": null, 
    "created_at": "2017-02-02 09:56:16", 
    "updated_at": "2017-02-02 09:56:16", 
    "subBrands": [] 
    }, 
    { 
    "id": 16, 
    "name": "Brand no children", 
    "parent": null, 
    "author": 1, 
    "deleted_at": null, 
    "created_at": "2017-02-02 10:37:40", 
    "updated_at": "2017-02-02 10:37:40", 
    "subBrands": [] 
    }, 
    { 
    "id": 37, 
    "name": "Whoops brand", 
    "parent": null, 
    "author": 1, 
    "deleted_at": null, 
    "created_at": "2017-02-02 11:44:10", 
    "updated_at": "2017-02-02 11:44:10", 
    "subBrands": [] 
    } 
] 

私が取得しようとしているどのようなものです:

[ 
    { 
    "id": 10, 
    "name": "Parent Brand 1", 
    "parent": null, 
    "author": 1, 
    "deleted_at": null, 
    "created_at": "2017-02-02 09:55:51", 
    "updated_at": "2017-02-02 09:55:51", 
    "subBrands": [ 
     { 
     "id": 32, 
     "name": "Sub Brand 7", 
     "parent": 10, 
     "author": 1, 
     "deleted_at": null, 
     "created_at": "2017-02-02 11:24:57", 
     "updated_at": "2017-02-02 11:42:18" 
     }, 
     { 
     "id": 33, 
     "name": "Sub Brand 8", 
     "parent": 10, 
     "author": 1, 
     "deleted_at": null, 
     "created_at": "2017-02-02 11:25:04", 
     "updated_at": "2017-02-02 11:42:34" 
     }, 
     { 
     "id": 34, 
     "name": "Sub Brand 9", 
     "parent": 10, 
     "author": 1, 
     "deleted_at": null, 
     "created_at": "2017-02-02 11:25:39", 
     "updated_at": "2017-02-02 11:42:43" 
     }, 
     { 
     "id": 35, 
     "name": "Sub Brand 10", 
     "parent": 10, 
     "author": 1, 
     "deleted_at": null, 
     "created_at": "2017-02-02 11:25:46", 
     "updated_at": "2017-02-02 11:42:52" 
     }, 
     { 
     "id": 36, 
     "name": "Sub Brand 4", 
     "parent": 10, 
     "author": 1, 
     "deleted_at": null, 
     "created_at": "2017-02-02 11:43:53", 
     "updated_at": "2017-02-02 11:43:53" 
     } 
    ] 
    }, 
    { 
    "id": 12, 
    "name": "Parent Brand 2", 
    "parent": null, 
    "author": 1, 
    "deleted_at": null, 
    "created_at": "2017-02-02 09:56:16", 
    "updated_at": "2017-02-02 09:56:16", 
    "subBrands": [] 
    }, 
    { 
    "id": 16, 
    "name": "Brand no children", 
    "parent": null, 
    "author": 1, 
    "deleted_at": null, 
    "created_at": "2017-02-02 10:37:40", 
    "updated_at": "2017-02-02 10:37:40", 
    "subBrands": [] 
    }, 
    { 
    "id": 37, 
    "name": "Whoops brand", 
    "parent": null, 
    "author": 1, 
    "deleted_at": null, 
    "created_at": "2017-02-02 11:44:10", 
    "updated_at": "2017-02-02 11:44:10", 
    "subBrands": [] 
    } 
] 

私はアンダースコアを使用することに開いています。私は来るよ最も近いです:

var brands = _.filter(brands, function(n) { 
     return _.some(n.subBrands, function(subBrand){ 
      return subBrand.id != brand.id; 
     }); 
    }); 

しかし、それはそれは私が必要なものに非常に近いではないですので、31のIDとsubBrandを含まない配列を除去します。

乾杯!

+0

これはどんな深さでも機能しますか?または単に第2レベルのために? –

+0

@ NinaScholz現時点では、私はそれを2番目のレベルで必要としています。うまくいけばもう必要ないでしょう。 – BarryWalsh

+0

_ "サブブランドを削除せずに親配列全体を元に戻そうとしています。" _オブジェクトを削除したことを意味しますか? – guest271314

答えて

1

var arr = [{"id":10,"name":"Parent Brand 1","parent":null,"author":1,"deleted_at":null,"created_at":"2017-02-02 09:55:51","updated_at":"2017-02-02 09:55:51","subBrands":[{"id":31,"name":"Sub Brand 6","parent":10,"author":1,"deleted_at":null,"created_at":"2017-02-02 11:24:49","updated_at":"2017-02-02 11:42:02"},{"id":32,"name":"Sub Brand 7","parent":10,"author":1,"deleted_at":null,"created_at":"2017-02-02 11:24:57","updated_at":"2017-02-02 11:42:18"},{"id":33,"name":"Sub Brand 8","parent":10,"author":1,"deleted_at":null,"created_at":"2017-02-02 11:25:04","updated_at":"2017-02-02 11:42:34"},{"id":34,"name":"Sub Brand 9","parent":10,"author":1,"deleted_at":null,"created_at":"2017-02-02 11:25:39","updated_at":"2017-02-02 11:42:43"},{"id":35,"name":"Sub Brand 10","parent":10,"author":1,"deleted_at":null,"created_at":"2017-02-02 11:25:46","updated_at":"2017-02-02 11:42:52"},{"id":36,"name":"Sub Brand 4","parent":10,"author":1,"deleted_at":null,"created_at":"2017-02-02 11:43:53","updated_at":"2017-02-02 11:43:53"}]},{"id":12,"name":"Parent Brand 2","parent":null,"author":1,"deleted_at":null,"created_at":"2017-02-02 09:56:16","updated_at":"2017-02-02 09:56:16","subBrands":[]},{"id":16,"name":"Brand no children","parent":null,"author":1,"deleted_at":null,"created_at":"2017-02-02 10:37:40","updated_at":"2017-02-02 10:37:40","subBrands":[]},{"id":37,"name":"Whoops brand","parent":null,"author":1,"deleted_at":null,"created_at":"2017-02-02 11:44:10","updated_at":"2017-02-02 11:44:10","subBrands":[]}]; 
 

 

 
var id = prompt("Id of subbrands to remove: "); 
 

 
arr.forEach(function(o) { 
 
    o.subBrands = o.subBrands.filter(s => s.id != id); 
 
}); 
 

 
console.log(arr);

+0

ありがとう!これはあまりにも、素敵なビットクリーナーも動作します。 – BarryWalsh

+1

配列をフィルタリングすることによってすべての新しい参照を作成します。これは、この目的のために最上位を少し上回っています。たとえ目的のIDを持つオブジェクトがなくても、新しい配列を生成します。 –

+0

'.forEach()'の各繰り返しで新しい配列を作成する必要があるのはなぜですか?ここでは、既存の配列からオブジェクトを削除する必要がありますか? – guest271314

0

あなたは自分の配列の各項目の「subBrands」プロパティを検討する必要がある、とあなたはアンダースコアを使用している、これが動作する場合:

var myBrand = _.each(brands, function(brand) { 
    brand.subBrands = _.filter(brand.subBrands, function(subBrand) { 
    return subBrand.id != 31; 
    }); 
}); 
1

あなたは親部品を反復可能性があり、子供たちと発見された場合、オブジェクトをスプライスします。

var data = [{ id: 10, name: "Parent Brand 1", parent: null, author: 1, deleted_at: null, created_at: "2017-02-02 09:55:51", updated_at: "2017-02-02 09:55:51", subBrands: [{ id: 31, name: "Sub Brand 6", parent: 10, author: 1, deleted_at: null, created_at: "2017-02-02 11:24:49", updated_at: "2017-02-02 11:42:02" }, { id: 32, name: "Sub Brand 7", parent: 10, author: 1, deleted_at: null, created_at: "2017-02-02 11:24:57", updated_at: "2017-02-02 11:42:18" }, { id: 33, name: "Sub Brand 8", parent: 10, author: 1, deleted_at: null, created_at: "2017-02-02 11:25:04", updated_at: "2017-02-02 11:42:34" }, { id: 34, name: "Sub Brand 9", parent: 10, author: 1, deleted_at: null, created_at: "2017-02-02 11:25:39", updated_at: "2017-02-02 11:42:43" }, { id: 35, name: "Sub Brand 10", parent: 10, author: 1, deleted_at: null, created_at: "2017-02-02 11:25:46", updated_at: "2017-02-02 11:42:52" }, { id: 36, name: "Sub Brand 4", parent: 10, author: 1, deleted_at: null, created_at: "2017-02-02 11:43:53", updated_at: "2017-02-02 11:43:53" }] }, { id: 12, name: "Parent Brand 2", parent: null, author: 1, deleted_at: null, created_at: "2017-02-02 09:56:16", updated_at: "2017-02-02 09:56:16", subBrands: [] }, { id: 16, name: "Brand no children", parent: null, author: 1, deleted_at: null, created_at: "2017-02-02 10:37:40", updated_at: "2017-02-02 10:37:40", subBrands: [] }, { id: 37, name: "Whoops brand", parent: null, author: 1, deleted_at: null, created_at: "2017-02-02 11:44:10", updated_at: "2017-02-02 11:44:10", subBrands: [] }]; 
 

 
data.some(function (a) { 
 
    return a.subBrands.some(function (b, i, bb) { 
 
     if (b.id === 31) { 
 
      bb.splice(i, 1); 
 
      return true; 
 
     } 
 
    }); 
 
}); 
 

 
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

ありがとうございました!それは完璧に働いた! – BarryWalsh

+0

これは、それらを含む最初に見つかったオブジェクトの一致サブブランドを削除します。 'arr = [{sb:[id:31]}、{sb:[id:31]}、{sb:[id:31]}]'が 'some'で見つかった最初のオブジェクトのみを削除することを考えてください。 –

+0

@ibrahimmahrir、私はすべての 'id'が一意であると仮定しています。すべてのサブアレイをフィルタリングする必要はありません。これは必要ではない新しい参照を生成する。環境を守ろう。 –

0

のforeachは動作するようです:

var brands=[{id:10,name:"Parent Brand 1",parent:null,author:1,deleted_at:null,created_at:"2017-02-02 09:55:51",updated_at:"2017-02-02 09:55:51",subBrands:[{id:31,name:"Sub Brand 6",parent:10,author:1,deleted_at:null,created_at:"2017-02-02 11:24:49",updated_at:"2017-02-02 11:42:02"},{id:32,name:"Sub Brand 7",parent:10,author:1,deleted_at:null,created_at:"2017-02-02 11:24:57",updated_at:"2017-02-02 11:42:18"},{id:33,name:"Sub Brand 8",parent:10,author:1,deleted_at:null,created_at:"2017-02-02 11:25:04",updated_at:"2017-02-02 11:42:34"},{id:34,name:"Sub Brand 9",parent:10,author:1,deleted_at:null,created_at:"2017-02-02 11:25:39",updated_at:"2017-02-02 11:42:43"},{id:35,name:"Sub Brand 10",parent:10,author:1,deleted_at:null,created_at:"2017-02-02 11:25:46",updated_at:"2017-02-02 11:42:52"},{id:36,name:"Sub Brand 4",parent:10,author:1,deleted_at:null,created_at:"2017-02-02 11:43:53",updated_at:"2017-02-02 11:43:53"}]},{id:12,name:"Parent Brand 2",parent:null,author:1,deleted_at:null,created_at:"2017-02-02 09:56:16",updated_at:"2017-02-02 09:56:16",subBrands:[]},{id:16,name:"Brand no children",parent:null,author:1,deleted_at:null,created_at:"2017-02-02 10:37:40",updated_at:"2017-02-02 10:37:40",subBrands:[]},{id:37,name:"Whoops brand",parent:null,author:1,deleted_at:null,created_at:"2017-02-02 11:44:10",updated_at:"2017-02-02 11:44:10",subBrands:[]}]; 
 

 
brands.forEach(function(brand) { 
 
    brand.subBrands = brand.subBrands.filter(function(subBrand){ 
 
     return subBrand.id != 31; 
 
    }) 
 
}); 
 

 
console.log(brands);

0

jQueryの道

function removeById(data, id){ 

    $(data).each(function(i, e){ 

     if(e.subBrands.length > 0){ 

     $(e.subBrands).each(function(_i, _e){ 

      if(_e.id == id){ 

       e.subBrands.splice(_i,1); 
       return false; 

      } 

     }); 

    } 

    }); 

    return data; 

} 

console.log(removeById(data,32)) 

この機能は、あなたがからid31を持つオブジェクトを削除するには、各subBrands配列、Array.prototype.splice()を反復するfor..ofループを使用することができますspecifiec IDオブジェクト

0

せずにあなたの全体のデータ配列を返します。アレイ。

for (let {subBrands} of data) { 
    let n = 0; 
    for (let {id} of subBrands) { 
    if (id === 31) { 
     subBrands.splice(n, 1); 
     break; 
    } 
    ++n; 
    } 
} 
関連する問題