2016-12-20 4 views
1

У меня есть некоторый код, который предназначен для выполнения следующего:Почему моя функция возвращает другой массив?

Даны два массива строк a1 и a2 возвращает отсортированный массив r в лексикографическом порядке строк a1 которые подстрока строк a2 ,
Массивы написаны в «общем» обозначении.

Теперь я делаю тест, где array1 = ["arp", "live", "strong"] и array2 = ["lively", "alive", "harp", "sharp", "armstrong"]. Я думаю, что у меня это есть, но я не понимаю, почему функция возвращает массив ["arp", "strong"], когда в последнем цикле for я заменяю newArray.splice(l, l+1) на newArray.splice(k, k+1). Может ли кто-нибудь сказать мне, почему это так?

function inArray(array1, array2) { 
 
    var newArray = []; 
 
    var sortedArray = []; 
 
    for (var i in array2) { 
 
     for (var j in array1) { 
 
      if (array2[i].includes(array1[j])) { 
 
       newArray.push(array1[j]); 
 
      }; 
 
     }; 
 
    }; 
 
    sortedArray = newArray.sort(); 
 
    for (var k = 0; k < newArray.length; k++) { 
 
     for (var l = 0; l < newArray.length; l++) { 
 
      if (newArray[k] === newArray[l] && k != l) { 
 
       newArray.splice(l, l + 1) 
 
      } 
 
     } 
 
    } 
 
    return sortedArray; 
 
}; 
 

 
console.log(inArray(["arp", "live", "strong"], ["lively", "alive", "harp", "sharp", "armstrong"]));

+0

Вы можете использовать ES6? Если это так, Sets может многое помочь с дупликацией. –

+0

[Не использовать 'для ... in' перечислений на массивах!] (Https://stackoverflow.com/q/500504/1048572) – Bergi

+0

Не используйте' splice'. Это запутанно и подвержено ошибкам. –

ответ

0

Похоже, вы усложнять это немного;)

a1 = ["arp", "live", "strong", "bazooka"] 
 
a2 = ["lively", "alive", "harp", "sharp", "armstrong"] 
 

 

 
result = a1 
 
    .filter(x => a2.some(y => y.includes(x))) 
 
    .sort(); 
 

 
console.log(result);

0

Причина заключается в том, что второй аргумент splice() не конечное положение сростка, но количество элементов, которые должны быть удалены. Поэтому, когда k = 1, вы удалили 2 элемента, а не только элемент с индексом 1.

Оба newArray.splice(l, 1) и newArray.splice(k, 1) работают правильно.

function inArray(array1,array2){ 
 
\t var newArray = []; 
 
\t var sortedArray = []; 
 
\t for (var i in array2) { 
 
\t \t for (var j in array1) { 
 
\t \t \t if (array2[i].includes(array1[j])) { 
 
\t \t \t \t newArray.push(array1[j]); 
 
\t \t \t }; 
 
\t \t }; 
 
\t }; 
 
\t sortedArray = newArray.sort(); 
 

 
\t for (var k = 0; k < newArray.length; k++) { 
 
\t \t for (var l = 0; l < newArray.length; l++) { 
 
\t \t \t if (newArray[k] === newArray[l] && k != l) { 
 
\t \t \t \t newArray.splice(k, 1); 
 

 
\t \t \t } 
 
\t \t } 
 
\t } 
 
\t return sortedArray; 
 
}; 
 

 
console.log(inArray(["arp", "live", "strong"], ["lively", "alive", "harp", "sharp", "armstrong"]));

0

В комментариях уже вы получите ответ. Используйте ES2015/ES6 всегда, вы можете, пользу от его приключений.

const words1 = ["arp", "live", "strong"]; 
 
const words2 = ["lively", "alive", "harp", "sharp", "armstrong"]; 
 
const final = []; 
 

 
words1.forEach(v => { 
 
    words2.forEach(v2 => { 
 
    if (v2.includes(v)) { 
 
     final.push(v); 
 
    } 
 
    }); 
 
}); 
 

 
const finalSorted = [...new Set(final.sort())]; 
 

 
// just to add html 
 
const pre = document.getElementById('result'); 
 

 
finalSorted.forEach(v => { 
 
    let content = pre.textContent; 
 
    content += `\n- ${v}`; 
 
    pre.textContent = content; 
 
});
<label>Result:</label> 
 
<pre id="result"></pre>

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