【问题标题】:Possible to merge in this object? (javascript)可以合并到这个对象中吗? (javascript)
【发布时间】:2016-11-05 02:28:15
【问题描述】:

是否可以(如果可以的话)合并具有相同值的标签,以便一个标签拥有一个包含所有画廊的数组?

例如,以此开头:

[{
    tag: "Kings",
    galleries: [
        "2016 Kings Draft Night"
    ]
}, {
    tag: "Draft",
    galleries: [
        "2016 Kings Draft Night"
    ]
}, {
    tag: "Kings",
    galleries: [
        "2016-17 Sacramento Kings Uniforms"
    ]
}]

并以此结束:

[{
    tag: "Kings",
    galleries: [
        "2016 Kings Draft Night", "2016-17 Sacramento Kings Uniforms"
    ]
}, {
    tag: "Draft",
    galleries: [
        "2016 Kings Draft Night"
    ]
}]

非常感谢任何帮助。对此感到困惑

【问题讨论】:

    标签: javascript json node.js object merge


    【解决方案1】:
    for (var i = 0; i < obj.length-1; i++){
        var currTag = obj[i].tag;  // get first element
    
       for (var j = i + 1; j < obj.length; j++){ // Search for matching tags
           var newTag = obj[j].tag; 
           if (currTag === newTag){
             array1 = obj[i].galleries;  // get gallery for prevElement
             array2 = obj[j].galleries; // get gallery for curr element
             Array.prototype.push.apply(array1, array2); // merge arrays
             obj.splice(j,1); // remove the curr array from obj
           }
       }  
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用.filter().reduce().map()rest elementspread element

      var arr = [{
        tag: "Kings",
        galleries: [
          "2016 Kings Draft Night"
        ]
      }, {
        tag: "Draft",
        galleries: [
          "2016 Kings Draft Night"
        ]
      }, {
        tag: "Kings",
        galleries: [
          "2016-17 Sacramento Kings Uniforms"
        ]
      }];
      
      var filterTags = (a, type) => a.filter(o => o.tag === type)
        .reduce((curr, next) => {
          [...curr.galleries] = [...curr.galleries, ...next.galleries];
          return curr
        });
      
      var res = ["Kings", "Draft"].map(val => filterTags(arr, val));
      
      console.log(res);

      【讨论】:

        【解决方案3】:

        您可以将filter() 改为concat() 现有的tag galleries,同时删除不必要的。

        var result = data.filter(function(item) {
          var ref = this[item.tag];
          if(!ref) {
            return (this[item.tag] = item);
          }
          ref.galleries = ref.galleries.concat(item.galleries);
        }, {});
        

        var data = [{
          tag: "Kings",
          galleries: [
            "2016 Kings Draft Night"
          ]
        }, {
          tag: "Draft",
          galleries: [
            "2016 Kings Draft Night"
          ]
        }, {
          tag: "Kings",
          galleries: [
            "2016-17 Sacramento Kings Uniforms"
          ]
        }];
        
        var result = data.filter(function(item) {
          var ref = this[item.tag];
          if(!ref) {
            return (this[item.tag] = item);
          }
          ref.galleries = ref.galleries.concat(item.galleries);
        }, {});
        
        document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

        【讨论】:

        • 对于没有经验的编码人员来说并不完全干净或易于理解,但我真的很喜欢这个。也可能几乎是最佳状态。
        【解决方案4】:

        合并功能:

        function merge(a){
         var r = {},n = [];
         for(var d in a) 
          r[a[d].tag] = (r[a[d].tag]) ? r[a[d].tag].concat(a[d].galleries) : a[d].galleries;
         for(var d in r) n.push({'tag':d,'galleries':r[d]});
         return(n);
        }
        

        还有一个测试:

        a = [{tag: "Kings",galleries: ["2016 Kings Draft Night"]},{tag: "Draft",galleries: ["2016 Kings Draft Night"]},{tag: "Kings",galleries: ["2016-17 Sacramento Kings Uniforms"]}];
        console.log(merge(a));
        

        【讨论】:

          【解决方案5】:

          你可以这样试试。

          var objA = [{
          tag: "Kings",
          galleries: [
              "2016 Kings Draft Night"
          ]
          }, {
          tag: "Draft",
          galleries: [
              "2016 Kings Draft Night"
          ]
          }, {
          tag: "Kings",
          galleries: [
              "2016-17 Sacramento Kings Uniforms"
          ]
          }]
          
          
          var result = [];
          
          for (var property in objA) {
          if (objA.hasOwnProperty(property)) {
              if (result.filter(function(e) { if( e.tag == objA[property].tag) return    e.galleries.push(objA[property].galleries[0]) }).length > 0) {
              }
              else
              {
                result.push(objA[property]);
              }
          
             }
            }
          
           console.log(result);
          

          plunker:http://plnkr.co/edit/7AijNY4Tb4DSDaiEQEEB?p=preview

          【讨论】:

            【解决方案6】:

            我相信还有更快的方法来做到这一点。但这是我想出的:

            var data = [{ tag: "Kings", galleries: [ "2016 Kings Draft Night" ] }, { tag: "Draft", galleries: [ "2016 Kings Draft Night" ] }, { tag: "Kings", galleries: [ "2016-17 Sacramento Kings Uniforms" ]}]
            
            
            var newData = {};
            data.forEach(function(a) {
              if (!newData[a.tag]) {
                newData[a.tag] = a.galleries;
              } else {
                newData[a.tag] = newData[a.tag].concat(a.galleries);
              }
            });
            
            var complete = [];
            Object.keys(newData).forEach(function(key) {
              complete.push({
                tag: key,
                galleries: newData[key]
              });
            });
            
            console.log(complete);

            【讨论】:

            • 成功了兄弟,谢谢。我这辈子都想不通!
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-01-28
            • 2018-12-11
            • 1970-01-01
            • 2021-10-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多