【问题标题】:Why does my function return a different array?为什么我的函数返回不同的数组?
【发布时间】:2017-05-05 15:45:28
【问题描述】:

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

给定两个字符串数组a1a2 返回一个排序数组r in a1 的字符串的字典顺序,它们是 a2 的字符串。
数组以“通用”表示法编写。

现在我正在测试array1 = ["arp", "live", "strong"]array2 = ["lively", "alive", "harp", "sharp", "armstrong"]。 我想我明白了,但我不明白为什么函数只返回数组["arp", "strong"],而在最后一个for循环中我用newArray.splice(k, k+1)替换newArray.splice(l, l+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"]));

【问题讨论】:

  • 你会用 ES6 吗?如果是这样,Sets 可以帮助解决复制问题。
  • 不要使用splice。它令人困惑且容易出错。
  • 您是否应该返回newArray 而不是sortedArray?还是在最后一个 for 循环中使用 sortedArray
  • 因为当k=0l &gt; 0 时,它会删除0 索引处的0+1 元素。所以它将删除arp

标签: javascript arrays for-loop splice


【解决方案1】:

原因是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"]));

【讨论】:

    【解决方案2】:

    在 cmets 中你已经得到了答案。尽可能使用 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>

    【讨论】:

      【解决方案3】:

      看起来你有点过于复杂了;)

      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);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-28
        • 1970-01-01
        • 1970-01-01
        • 2014-11-02
        • 1970-01-01
        • 2022-06-14
        • 2021-12-25
        相关资源
        最近更新 更多