2016-10-28 2 views
-2

Я новичок в сопоставлении массива javascript.Соответствие javascript для отображения уникального результата

У меня есть два массива. каждый массив имеет такое же число элементов: 11

txtfilename=['txt1','txt6','txt6','txt6','txt7','txt7','txt8','txt9','txt9','txt9','txt9'] 
content=['apple from one','six trees','cats','happy dogs','healthy fruit','good job','ask question','check safety','stay in the house','good results','happy holiday'] 

по сути, такое же положение элемента в txtfilename сопоставляется ту же позицию элемента в содержании.

например: 2-й элемент в txtfilename соответствует 2-му элементу содержимого.

однако, txtfilename имеет дублированный элемент, элемент контента уникален.

У меня проблема с сопоставлением этих двух массивов. Я хочу, чтобы отобразить эти два массива следующим образом:

txtfilename: txt1 
content: apple from one 

txtfilename:txt6 
content:'six trees','cats','happy dogs' 

txtfilename:txt7 
content:'healthy fruit','good job' 

txtfilename:txt8 
content:'ask question' 

txtfilename:txt9 
content:'check safety','stay in the house','good results','happy holiday' 
+3

(psst ... java не является javascript) – evolutionxbox

+3

Вы используете Java или Javascript? Вы отметили оба – khelwood

+0

. Я использую их оба. больше сосредоточено на javascript – bob90937

ответ

3
//Initialising arrays 
    String[] txtfilename = new String[] {"txt1", "txt6", "txt6", "txt6", "txt7", "txt7", "txt8", 
      "txt9", "txt9", "txt9", "txt9"}; 

    String[] content = new String[] {"apple from one", "six trees", "cats", "happy dogs", 
      "healthy fruit", "good job", "ask question", "check safety", "stay in the house", 
      "good results", "happy holiday"}; 

    //creating a map 
    Map<String, String> fileNameWithContents = new HashMap<>(); 

    //iterating through the array 
    for (int i = 0; i < txtfilename.length; i++) { 

     //check whether the map contains the txtfilename 
     if (fileNameWithContents.containsKey(txtfilename[i])) { 

      //appending the new content to the existing content in map 
      //Eg: txt6, txt7 and txt9 
      StringBuilder val = new StringBuilder(fileNameWithContents.get(txtfilename[i])); 
      val.append(", "); 
      val.append(content[i]); 
      fileNameWithContents.put(txtfilename[i], val.toString()); 
     } else { 
      //adding filename and content to map 
      fileNameWithContents.put(txtfilename[i], content[i]); 
     } 

    } 

    // Printing contents of map 
    for (Entry<String, String> e : fileNameWithContents.entrySet()) { 
     System.out.println("txtfilename: " + e.getKey()); 
     System.out.println("txtfilename: " + e.getValue()); 
     System.out.println(); 
    } 

Это сделать работу

+1

Как насчет небольшого объяснения? OP может действительно хотеть узнать что-то ... –

+1

Я использую hashMap для хранения содержимого asd-файла asd (ключ - имя файла, а содержимое - значение). HashMap не будет иметь дубликатов ключей в нем. Я выполняю итерацию через массив имен файлов и сохраняю конкурс против соответствующего имени файла. Сложная часть - это имя файла, которое можно дублировать .. сделать перед добавлением данных на карту. Я проверяю имеет ли карта некоторые данные для выбранного ключа. Если есть некоторое значение, то добавление нового значения в значение из карты. надеюсь, что это поможет .. – Jobin

+0

Спасибо @Jobin, теперь было бы прекрасно, если вы отредактировали свой ответ и добавили свое объяснение там, а не только как комментарий. :-) –

0

В JavaScript можно реализовать алгоритм MapReduce:

var result = txtfilename.map((item, index) => ({"txtfilename": item, "content": content[index]})); 
var shift = 0; 
txtfilename.forEach((item, index, arr) => { 
    if (index < arr.length - 1 && item === arr[index+1]) 
    { 
     result[index + shift].content += ", " + content[index+1]; 
     result.splice(index + 1 + shift, 1); 
     shift --; 
    } 
}); 
console.log(result); 
// [ { txtfilename: 'txt1', content: 'apple from one' }, 
// { txtfilename: 'txt6', content: 'six trees, cats, happy dogs' }, 
// { txtfilename: 'txt7', content: 'healthy fruit, good job' }, 
// { txtfilename: 'txt8', content: 'ask question' }, 
// { txtfilename: 'txt9', content: 'check safety, stay in the house, good results, happy holiday' } ] 

Edit:
Во-первых, я сопоставляю textfilename и контент, чтобы получить массив объектов. Каждый объект имеет свойство txtfilename и content.
Затем, поскольку массив отсортирован по txtfilename, я сравниваю каждый объект со своим соседством. Если оба объекта имеют один и тот же ключ (свойство textfilename), я конкатюю в первом объекте две строки (контент proprety), и я удаляю второй объект, который стал избыточным.

+0

Можете ли вы дать какое-то объяснение? – bob90937

+0

Я только что отредактировал, чтобы дать объяснения. Не стесняйтесь спрашивать, недостаточно ли это ясно. Вам будет дан ответ –

Смежные вопросы