簡體   English   中英

如何根據另一個對象的路徑屬性數組更改對象屬性?

[英]How do I change an object attribute based off of a path property array in another object?

目前,我不確定如何在javascript(React JS)程序中編輯我的對象之一。 我正在程序中實現Web套接字,因此我收到了一個對象,我需要使用該對象來編輯程序中的另一個對象。

這是兩個匯總的對象(僅包含更新的屬性):

objectWeAreEditingWith = {
    path: [
        "playerStatuses",
        "id1"                         //really is an id like "b02a507f-31..."
    ],
    value: [
        true,
        "Random"
    ]
}

objectWeAreEditing = {
    property1: ...
    property2: ...
    ...
    playerStatuses: {
        id1: [
            false,
            "Generalist"
        ]
    }
    ...
    moreProperties: ...
}

有關對象的一些細節。 “ objectWeAreEditingWith”將始終僅具有path和value屬性。 path屬性僅包含訪問“ objectWeAreEditing”中的正確鍵所需的鍵。 value屬性僅包含要在path屬性中詳細說明的鍵中更改的變量值。 “ ObjectWeAreEditing”可以包含任意數量的屬性。 要注意的另一件事是,數組“值”中的值始終與我們在“ objectWeAreEditing”中定位的屬性的順序(和大小)相同。 “ path”,“ value”和“ id1”在技術上可以是任意大小(很長的路徑/許多變量),但是id1和value始終具有相同的長度/具有與我之前說的順序相同的值。

對於這種情況,我正在嘗試做:

objectWeAreEditing[playerStatuses][id1][0] = objectWeAreEditingWith[value][0];

objectWeAreEditing[playerStatuses][id1][1] = objectWeAreEditingWith[value][1];

問題是,當然,我不知道自己正在編輯:

objectWeAreEditing[playerStatuses][id1] 

因為此路徑是由“ objectWeAreEditingWith”給出的。 我也不知道我只是在編輯:

objectWeAreEditing[playerStatuses][id1][0];

objectWeAreEditing[playerStatuses][id1][1];

因為我正在編輯的變量數量在“ objectWeAreEditingWith”中給出。

第二部分的解決方案是進入“值”屬性並檢查其長度,並遍歷其中的許多變量(在本例中為id1)。 但是,我不知道如何遍歷對象內部鍵的路徑。

如果要根據object1object2設置數據,一種解決方案是:

let object1 = {
    path: [
        "playerStatuses",
        "id1"               
    ],
    value: [
        true,
        "Random"
    ]
};
let object2 = {
    property1: true,
    property2: true,
    playerStatuses: {
        id1: [
            false,
            "Generalist"
        ]
    }
};
console.log(object2);
(function setObjectFrom(object1, object2) {
  var i = 0;
  if (object1.path.length <= 0) {
    throw "Cannot set empty path";
  }
  var currentToKey = object1.path[i];


  (function walkerObject(object, value) {
    for (let key in object) {
       if (key == currentToKey) {
         if (object1.path.length-i <= 1) {
           object[key] = value;
         }
         else {
           i++;
           currentToKey = object1.path[i];
           walkerObject(object[key], value); // call itself
         }
       }
    } 
  })(object2, object1.value);
})(object1, object2);

console.log(object2);

這里:一個函數( setObjectFrom )被定義以設定的屬性object2根據的object1.pathobject1.value 它定義了另一個名為walkerObject函數。 此函數執行以下操作:每次找到path的值(將其命名為vPath)作為object1的鍵時,它都會驗證它是否為最后一個鍵:

  • 當它是最后一個鍵時,它將value設置為object2[vPath]
  • 如果不是最后一個鍵,則walkerObject再次調用自身以查找path的下一個值,但將object2[vPath]作為object2

這個功能是不是防彈影響,這就意味着,它不處理錯誤,如object1.path沒有發現里面object2等情況。

對應的jsBin

暫無
暫無

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

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