为什么我的函数返回不同的数组?

时间:2016-12-20 12:12:46

标签: javascript arrays for-loop splice

我有一些代码可以执行以下操作:

  

给定两个字符串数组a1a2返回一个已排序的数组r   a1的字符串的字典顺序,它们是...的子串   字符串a2
数组写在" general"符号

现在我正在array1 = ["arp", "live", "strong"]array2 = ["lively", "alive", "harp", "sharp", "armstrong"]进行测试。 我想我已经知道了,但是我不明白为什么函数只在最后一个for循环中返回数组["arp", "strong"]我用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"]));
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:0)

原因是splice()的第二个参数不是拼接的结束位置,而是应该删除的元素数。因此,在k = 1时,您删除了2个元素,而不仅仅是索引1中的元素。

newArray.splice(l, 1)newArray.splice(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(k, 1);

	 		}
	 	}
	 }
	 return sortedArray;
};

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

答案 1 :(得分:0)

在评论中你已经得到了答案。始终可以使用ES2015 / ES6,并从中受益。

&#13;
&#13;
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;
});
&#13;
<label>Result:</label>
<pre id="result"></pre>
&#13;
&#13;
&#13;

答案 2 :(得分: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);