如何根据另一个对象中的路径属性数组更改对象属性?

时间:2018-04-12 15:29:54

标签: javascript reactjs

我目前不确定如何在我的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属性只包含在" objectWeAreEditing"中访问正确密钥所需的密钥。 value属性只包含要在path属性中详细说明的键中更改的变量值。 " ObjectWeAreEditing"可以包含任意数量的属性。另外需要注意的是数组中的值" value"始终与我们在" objectWeAreEditing"中定位的属性具有相同的顺序(和大小)。 "路径","值"," id1"可以技术上任何大小(非常长的路径/很多变量),但id1和值将始终具有相同的长度/具有与我之前说过的相同顺序的值。

对于这种情况,我正在尝试:

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)。但是,我不知道如何遍历对象内部的键路径。

1 个答案:

答案 0 :(得分:0)

如果您想根据object2object1中设置数据,则有一种解决方案:

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)被定义为根据object2object1.path设置object1.value的属性。它定义了另一个名为walkerObject的函数。此函数执行以下操作:每次找到值path(将其命名为vPath)作为object1的键时,它将验证它是否为最后一个键:

  • 如果是最后一个密钥,则会将value设置为object2[vPath]
  • 的值
  • 如果它不是最后一个键,则walkerObject会再次调用自己查找path的下一个值,但object2[vPath]为object2

此功能不是防弹,也就是说,它不会处理object1.path内部object2内未发现错误等错误。

Corresponding jsBin