簡體   English   中英

另一個JavaScript數組挑戰

[英]Another javascript array challenge

解決了另一種數組操作,我花了比平時更長的時間來解決這個問題。 我需要組合數組值的幫助:

var array1 = ["alpha|LJ", "bravo|MH", "charlie|MH", "delta|MF",
              "echo|16", "{foxtrot}|GG", "{golf}|HS"];

var array2 = ["charlie-{golf}-{foxtrot}", "echo-{golf}"]; //some templates

這樣最終數組為:

final_array = ["alpha-LJ", "bravo-MH", "charlie-HS-GG-MH", "delta-MF",
               "echo-HS-16"];

為了明確說明我是如何使用final_array到達的,alpha,bravo和delta只得到了它們的“ |” 因為在我的array2模板上找不到它們,所以用“-”代替。 charlie和echo得到了模板,因此根據array1替換了{}的各個值。 老實說,Array1並不是我現在能想到的最好的key:value關系。

以下是一些要求:

* Anything in array1 with {} braces are not meant to be templated.
* Keywords in array2 will always have a matching value in array1. 

我已經讀過有關jquery .map()的文章,並認為使用它可以實現,也許可以與Regexp一起使用。 希望您會利用這些。 同樣,如果有幫助,final_array可以是任何順序。

我真的需要加強對這兩個主題的了解...:|

先感謝您。

編輯 :更新以匹配您的輸出並評論一些瘋狂。 考慮到split()在開始時先對值進行了設置,然后在結束時又對值進行了設置,這似乎並不是最有效的方法……但它確實有效。

function funkyTransform( values, templates ){
  // Make a copy of the array we were given so we can mutate it
  // without rudely changing something passed to our function.
  var result = values.concat();

  // Map {value} entries for later lookup, and throw them out of the result
  var valueMap = {};
  for (var i=result.length-1;i>=0;--i){
    var pair = result[i].split('|');
    if (pair[0][0]=="{"){
      valueMap[pair[0]] = pair[1];
      result.splice(i,1); // Yank this from the result
    }
  }
  console.log(valueMap);
  // {
  //   "{foxtrot}": "GG",
  //   "{golf}":    "HS"
  // }

  // Use the value map to replace text in our "templates", and
  // create a map from the first part of the template to the rest.
  // THIS SHOULD REALLY SCAN THE TEMPLATE FOR "{...}" PIECES
  // AND LOOK THEM UP IN THE MAP; OOPS O(N^2)
  var templateMap = {};
  for (var i=templates.length-1;i>=0;--i){
    var template = templates[i];
    for (var name in valueMap){
      if (valueMap.hasOwnProperty(name)){
        template = template.replace(name,valueMap[name]);
      }
    }
    var templateName = template.split('-')[0];
    templateMap[ templateName ] = template.slice(templateName.length+1);
  }
  console.log(templateMap);
  // {
  //   "charlie": "HS-GG",
  //   "echo":    "HS"
  // }

  // Go through the results again, replacing template text from the templateMap
  for (var i=result.length-1;i>=0;--i){
    var pieces = result[i].split('|');
    var template = templateMap[pieces[0]];
    if (template) pieces.splice(1,0,template);
    result[i] = pieces.join('-');
  }
  return result;
}

var output = funkyTransform( array1, array2 );
console.log(output);
// ["alpha-LJ", "bravo-MH", "charlie-HS-GG-MH", "delta-MF", "echo-HS-16"]

盡管我作了一些假設,但這設法獲得了所需的輸出:

  • array1中帶有{}大括號的所有內容均不應作為模板。
  • array2中的關鍵字在array1中將始終具有匹配值(可以輕松更改,但不確定您的規則是什么)。

碼:

// This is the main code
var final_array = $.map(array1, function (item) {
    var components = item.split('|');
    // Ignore elements between {} braces
    if (/^\{.*\}$/.test(components[0])) return;
    components[0] = template(components[0]); 
    return components.join('-');
});

// Helper to lookup array2 for a particular string and template it
// with the values from array1
function template(str) {
    var index = indexOfMatching(array2, str, '-');
    if (index == -1) return str;

    var components = array2[index].split('-');
    var result = [str];
    for (var i = 1; i < components.length; i++) {
        result.push(array1[indexOfMatching(array1, components[i], '|')]
            .split('|')[1]);
    }
    return result.join('-');
}

// Helper to for looking up array1 and array2
function indexOfMatching(array, target, separator) {
    for (var i = 0; i < array.length; i++) {
        if (array[i].split(separator)[0] === target) return i;
    }
    return -1;
}

暫無
暫無

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

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