Search code examples
xpagesxpages-ssjs

Nice way to flatten two vectors into 1 map?


Is there a nicer way to flatten two multi-value fields from a Notes document into a map collection in SSJS?

so far I came to the following:

var vw:NotesView = database.getView("configuration");
    if(null != vw){
        var doc:NotesDocument = vw.getFirstDocument();
        if (null != doc){
            var itemname1:string = "userName";
            var itemname2:string = "inboxFile";
            if(doc.hasItem(itemname1) && doc.hasItem(itemname2)){
                var itemvalues1:java.util.Vector = doc.getItemValue(itemname1);
                var itemvalues2:java.util.Vector = doc.getItemValue(itemname2);

                if(itemvalues1.size() == itemvalues2.size()){
                    var map = new java.util.HashMap();
                    var iterator1 = itemvalues1.iterator();
                    var iterator2 = itemvalues2.iterator();                 
                }               

                while (iterator1.hasNext()) {
                    var itemvalue1 = iterator1.next();
                    var itemvalue2 = iterator2.next();
                    if ((typeof(itemvalue1)).endsWith("string")) {
                        map.put(itemvalue1.left(80), itemvalue2.left(80));                      
                    }
                }
                sessionScope.put("setupInbox",map)
            }           
        }
    }   

Solution

  • If the JavaScript forEach construct is supported you can use this:

         function mergeVector(keyVector, valueVector) {
            var map = new java.util.HashMap();
            keyVector.forEach(function(curKey, index) {
                if (index < valueVector.size()) {
                    map.put(curKey, valueVector.get(index));
                }
            });
            return map;
         }
    

    otherwise use:

         function mergeVector(keyVector, valueVector) {
            var map = new java.util.HashMap();
            for(var index = 0; index < keyVector.size(), index++) {
                if (index < valueVector.size()) {
                    map.put(keyVector.get(index), valueVector.get(index));
                }
            };
            return map;
         }
    

    Hope this helps