【问题标题】:two object search by key and swap value通过键和交换值搜索两个对象
【发布时间】:2019-10-09 16:15:02
【问题描述】:

我想用 objectA 值替换 objectB 键。 在交换之前,objectA 和 ObjectB 键应该在每个对象中匹配。 然后在objectC中返回数据。

我看到了这个帖子,但我只想在交换键和值之前匹配键。 Swap key with value JSON

喜欢这个

 var objA ={100:'new',200:'in progress',300:'done',500:'exception',225:'critical'};

 var objB ={100:12,200:5,300:50};

objectA 和 objectB 具有相同的键。

objectA key 是 statusID,value 类似于 Display statusID name for user。

objectB的key是statusID,value是statusID的count,所以这个count值就是sample。

所以首先,我要 objectA 和 objectB 键匹配。这次,100,200,300 是相同的键。

如果它们匹配,则匹配 objectA 键的值替换 objectB 键。 比如,键 100 匹配,objectB 键 100 应该变成“新”。那么最后,objectC的结果应该是这样的。

var objC ={'new':12,'in progress':5,'done':50};

欢迎提出任何建议。 感谢阅读。

【问题讨论】:

    标签: javascript arrays dictionary ecmascript-5


    【解决方案1】:

    哎呀,我不知道你在做什么 -

    const heck = (a = {}, b = {}) =>
      Object
        .entries(a)                   // using all entries from either object ...
        .reduce                       // reduce each ...
          ( (r, [ k, v ]) =>          // result, r, and key/value pair
              b[k] === undefined      // if key does not exist in other object
                ? r                   // continue with current result
                : { ...r, [v]: b[k] } // otherwise extend result with new key/value
          , {}                        // initial result
          )
    
    const objA =
      {100:'new', 200:'in progress', 300:'done', 500:'exception', 225:'critical'}
    
    const objB =
      {100:12, 200:5, 300:50}
    
    console.log(heck(objA, objB))
    
    // { "new": 12
    // , "in progress": 5
    // , "done": 50
    // }

    这是另一种可能更容易理解的编写方式。缺点是它做了一些不必要的迭代 -

    const heck = (a = {}, b = {}) =>
      Object.fromEntries                     // create new object from ...
        ( Object
            .keys(a)                         // all keys of either object
            .filter(k => b[k] !== undefined) // filter out non-matches in other
            .map(k => [ a[k], b[k] ])        // new [key, value] pair
        )
    

    【讨论】:

      【解决方案2】:

      您应该将其视为创建一个新对象,该对象将来自其他两个对象的数据组合在一起。你可以通过在objB 中的键数组上调用reduce() 来做你想做的事:

      objC = objB.keys().reduce(result, key => {
          result[objA[key]] = objC[key];
          return result;
      });
      

      【讨论】:

      • 天真地分配result[objA[key]] 其中objA[key] 可能是undefined
      • @user633183 是的,我是根据 OPs 示例词典中的一些假设编写的。更健壮的代码将检查 undefined 值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      • 2018-02-18
      相关资源
      最近更新 更多