簡體   English   中英

迭代數組中的嵌套對象並刪除屬性名稱和值

[英]Iterate over Nested Objects in Array and delete the Property names and Values

我有如下數組,我想要做的是根據另一個數組中的值從下面的數組中刪除屬性名稱,即鍵和值。

選項是創建一個新數組,如下所示,僅包含來自 Keep Array 的值,或者從原始數組中刪除未在“keep”數組中列出的值。

var Keep=["ItemID","ItemNumber","OptionNo","Quantity","Price","Description","StockStatus","Url"]; 
var originalarray=[
      {
        "ItemID": 1,
        "ItemNumber": "611741",
        "OptionNo": "22",
        "SizeDescription": "3-6 Mths",
        "Price": "14.00",
        "Quantity": 1,
        "StockStatus": "instock",
        "StockMessage": "In Stock",
        "WarrantyItem": null,
        "Description": "Coral/Blue Embellished Two In One Dress (3mths-7yrs)",
        "Url": "/g82272s2",
        "FulfilmentType": ""
      },
      {
        "ItemID": 2,
        "ItemNumber": "912767",
        "OptionNo": "13",
        "SizeDescription": "11 EU 29",
        "Price": "16.00",
        "Quantity": 1,
        "StockStatus": "instock",
        "StockMessage": "In Stock",
        "WarrantyItem": null,
        "Description": "Silver Buckle Corkbed Sandals (Younger)",
        "Url": "/g82272s2",
        "CustomItemFields": [],
        "FulfilmentType": ""
      }
    ]

我試圖創建新數組,但該數組不是嵌套的,因此我在同一個鍵中有多個條目,具有不同的值,如下所示:

["ItemID:1", 
"ItemNumber:611741", 
"OptionNo:22", 
"Price:14.00", 
"Quantity:1", 
"StockStatus:instock", 
"Description:Coral/Blue Embellished Two In One Dress (3mths-7yrs)", "Url:/g82272s2", 
"ItemCategory:Dresses", 
"ItemID:2",
 "ItemNumber:912767", 
"OptionNo:13", 
"Price:16.00",
 "Quantity:1", 
"StockStatus:instock", 
"Description:Silver Buckle Corkbed Sandals (Younger)", 
"Url:/g82272s2", 
"ItemCategory:Sandals"]

I want the result array to be like this 

[{"ItemID:1", 
"ItemNumber:611741", 
"OptionNo:22", 
"Price:14.00", 
"Quantity:1", 
"StockStatus:instock", 
"Description:Coral/Blue Embellished Two In One Dress (3mths-7yrs)", "Url:/g82272s2", 
"ItemCategory:Dresses"}, 
{"ItemID:2",
 "ItemNumber:912767", 
"OptionNo:13", 
"Price:16.00",
 "Quantity:1", 
"StockStatus:instock", 
"Description:Silver Buckle Corkbed Sandals (Younger)", 
"Url:/g82272s2", 
"ItemCategory:Sandals"}]

這是我的代碼:

var keep=["ItemID", "ItemNumber", "OptionNo", "Quantity", "Price", "Description", "ItemCategory", "StockStatus", "Url"],z={}; z=new Array(); y.forEach(function(arrays){
  // 4 arrays in a
  var x=Object.keys(arrays);
  var k=Object.values(arrays); 
  //console.log(x);
  //console.log(y);
for(var i = 0; i < x.length; i++) {
  //console.log(x[i]);
 keep.forEach(function(item,index,array){
      if(item==x[i]){
          //z.push(x[i]+":"+y[i]);
         z.push(x[i]+":"+k[i]);
          return z;
                    }
  })
 }
  })

希望你能幫忙。

謝謝你。

更新
為此,這里是lodash版本,也可能更容易閱讀:

 const keep = (k, l) => _.map(l, o => _.pick(o, k)) const keepThese = ["ItemID", "ItemNumber", "OptionNo", "Quantity", "Price", "Description", "StockStatus", "Url"] const orig = [{"ItemID": 1, "ItemNumber": "611741", "OptionNo": "22", "SizeDescription": "3-6 Mths", "Price": "14.00", "Quantity": 1, "StockStatus": "instock", "StockMessage": "In Stock", "WarrantyItem": null, "Description": "Coral/Blue Embellished Two In One Dress (3mths-7yrs)", "Url": "/g82272s2", "FulfilmentType": ""}, {"ItemID": 2, "ItemNumber": "912767", "OptionNo": "13", "SizeDescription": "11 EU 29", "Price": "16.00", "Quantity": 1, "StockStatus": "instock", "StockMessage": "In Stock", "WarrantyItem": null, "Description": "Silver Buckle Corkbed Sandals (Younger)", "Url": "/g82272s2", "CustomItemFields": [], "FulfilmentType": ""}] console.log(keep(keepThese, orig))
 <script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

文檔: _.map() , _.pick()


下面的keep函數將執行此操作,盡管例如使用lodash可能有更優雅的方法。

 const keep = (k, l) => l.map(o => Object.entries(o).reduce((r, [n, v]) => k.includes(n) ? (r[n] = v, r) : r, {})) const keepThese = ["ItemID", "ItemNumber", "OptionNo", "Quantity", "Price", "Description", "StockStatus", "Url"] const orig = [{"ItemID": 1, "ItemNumber": "611741", "OptionNo": "22", "SizeDescription": "3-6 Mths", "Price": "14.00", "Quantity": 1, "StockStatus": "instock", "StockMessage": "In Stock", "WarrantyItem": null, "Description": "Coral/Blue Embellished Two In One Dress (3mths-7yrs)", "Url": "/g82272s2", "FulfilmentType": ""}, {"ItemID": 2, "ItemNumber": "912767", "OptionNo": "13", "SizeDescription": "11 EU 29", "Price": "16.00", "Quantity": 1, "StockStatus": "instock", "StockMessage": "In Stock", "WarrantyItem": null, "Description": "Silver Buckle Corkbed Sandals (Younger)", "Url": "/g82272s2", "CustomItemFields": [], "FulfilmentType": ""}] console.log(keep(keepThese, orig))

說明.map()輸入到Object.entries() .reduce()到一個Object ,從{}開始。
所以(r, [n, v]) => k.includes(n) ? (r[n] = v, r) : r (r, [n, v]) => k.includes(n) ? (r[n] = v, r) : r為數組中每個對象的每個屬性運行。 如果屬性數組要保留.includes()當前屬性的名稱,則將相應的屬性 & 值添加到r 否則不要觸摸r 對下一個屬性重復,最后將r添加到結果數組中。

我建議你學習map()filter()甚至find()

請參閱有關使用MapFilterFind的文檔。

使用它們,您可以對數組中的對象執行各種驗證和轉換。

並排除具有對象值的鍵,您將需要:

delete myObject.regex;
// or,
delete myObject['regex'];
// or,
var prop = "regex";
delete myObject[prop];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM