在数组之间提取匹配值并将它们保存到javascript中的新数组中

时间:2018-04-09 09:59:02

标签: javascript arrays

我对编程很陌生,我正在尝试完成以下练习:

声明一个新变量来存储从a2中提取的所有a1。 迭代所有a2的元素,只提取与a1中的值匹配的元素。

var a1 = ["5", "10"];
var a2 = [
  ["10", "2", "10", "E", "5", "5", "u", "0", "5", "10", ":", "5"],
  ["10", "10", "5", "9", "10", "}", "5", "l", "5", "5", "5", "˜"],
  ["x", ".", "d", "2", "|", "[", "z", "8", "s", "d", "2", "5"]
];
var a3 = [];



for (var i = 0; i < a2.length; i++) {
  for (var j = 0; j < a2[i].length; j++) {
    if (a1[0] === a2[i][j] || a1[1] === a2[i][j]) {
      a3 = a2[i][j];
      console.log(a3);
    } else {
      console.log("false")
    }
  }
}

console.log(a3)

目前,我有这段代码。当我在循环外检查a3时,我没有达到我的预期。如何获取匹配值以进入这个新数组(a3)?

8 个答案:

答案 0 :(得分:0)

您需要a3.push来添加数组中的元素

var a1 = ["5", "10"];
var a2 = [
  ["10", "2", "10", "E", "5", "5", "u", "0", "5", "10", ":", "5"],
  ["10", "10", "5", "9", "10", "}", "5", "l", "5", "5", "5", "˜"],
  ["x", ".", "d", "2", "|", "[", "z", "8", "s", "d", "2", "5"]
];
var a3 = [];

for (var i = 0; i < a2.length; i++) {
  for (var j = 0; j < a2[i].length; j++) {
    if (a1[0] === a2[i][j] || a1[1] === a2[i][j]) {
      a3.push(a2[i][j]);

    } else {}
  }
}

console.log(a3);

或者您可以使用indexOf&amp; forEach

var a1 = ["5", "10"];
var a2 = [
  ["10", "2", "10", "E", "5", "5", "u", "0", "5", "10", ":", "5"],
  ["10", "10", "5", "9", "10", "}", "5", "l", "5", "5", "5", "˜"],
  ["x", ".", "d", "2", "|", "[", "z", "8", "s", "d", "2", "5"]
];
var a3 = [];

a1.forEach(function(item) {
  if (a1.indexOf(item) !== -1) {
    a3.push(item)
  }
})
console.log(a3);

答案 1 :(得分:0)

问题是你没有向a3添加元素,只是通过

覆盖找到的每个匹配项的a3的全部内容。
a3 = a2[i][j];

相反,推送到数组中:

a3.push(a2[i][j]);

此外,您的代码目前假设a1永远不会有两个以上的元素,因为您已经对代码进行了硬编码,仅查看其第一个和第二个元素。我们可以通过询问a1“是否包含”给定值:

来使其更具动态性
for (var i = 0; i < a2.length; i++) {
    for (var j = 0; j < a2[i].length; j++) {
        if (a1.includes(a2[i][j])) a3.push(a2[i][j]); //includes() returns a boolean

答案 2 :(得分:0)

您是直接将匹配值分配给a3,而不是将数据推送到a3数组中。

而不是这样做

a3 = a2[i][j];

这样做

a3.push(a2[i][j])

答案 3 :(得分:0)

您可以使用.concat().filter().includes()

let a3 = [].concat(...a2).filter(v => a1.includes(v));

说明

  • 使用.concat()和`spread syntax。
  • 创建包含所有子数组的所有元素的单个数组
  • 使用.filter()过滤此数组,仅选择那些通过过滤器测试的元素。
  • 可以使用.includes()检查其他数组中元素的存在。

<强>演示:

let a1 = ["5", "10"],
    a2 = [["10", "2", "10", "E", "5", "5", "u", "0", "5", "10", ":", "5"],["10", "10", "5", "9", "10", "}", "5", "l", "5", "5", "5", "˜"],["x", ".", "d", "2", "|", "[", "z", "8", "s", "d", "2", "5"]];

let a3 = [].concat(...a2).filter(v => a1.includes(v));

console.log(a3);
.as-console-wrapper { max-height: 100% !important; top: 0; }

<强>文档:

答案 4 :(得分:0)

您正在将值插入数组。这应该是PUSH方法。

如果您尝试使用(a3 = a2 [i] [j]),这将替换您之前的值。请使用push方法插入。添加了以下代码。 a3.push(10)

push()方法将新项添加到数组的末尾。

答案 5 :(得分:0)

// First we flatten the array to get rid of nested arrays
const flattened = a2.reduce((acc, val) => acc.concat(val), []);
// Then we loop through the flattened array and check if the current value (x) exists inside the a1 array - if true -> push to a3
flattened.map(x => a1.includes(x) && a3.push(x))

答案 6 :(得分:0)

您可以合并Array.prototype.reduce(),Array.prototype.concat()] 3Array.prototype.filter()Array.prototype.includes()

代码:

const a1 = ["5", "10"];
const a2 = [["10", "2", "10", "E", "5", "5", "u", "0", "5", "10", ":", "5"], ["10", "10", "5", "9", "10", "}", "5", "l", "5", "5", "5", "˜"], ["x", ".", "d", "2", "|", "[", "z", "8", "s", "d", "2", "5"]];
const a3 = a2
  .reduce((a, c) => a.concat(c), [])
  .filter(item => a1.includes(item));

console.log(a3);

答案 7 :(得分:0)

您可以使用filter()reduce()includes()Spread syntax(* ES6)来获得所需的结果。

  

ES5

var a1 = ["5", "10"];
	a2 = [["10", "2", "10", "E", "5", "5", "u", "0", "5", "10", ":", "5"],["10", "10", "5", "9", "10", "}", "5", "l", "5", "5", "5", "˜"],["x", ".", "d", "2", "|", "[", "z", "8", "s", "d", "2", "5"]];

var mergerResult = a2.reduce(function(r, v){ 
	return r.concat(v);
}, []);

mergerResult = mergerResult.filter(function(value){
	return a1.includes(value)
});

console.log(mergerResult,'lenght',mergerResult.length);

  

ES6

const a1 = ["5", "10"];
a2 = [["10", "2", "10", "E", "5", "5", "u", "0", "5", "10", ":", "5"],["10", "10", "5", "9", "10", "}", "5", "l", "5", "5", "5", "˜"],["x", ".", "d", "2", "|", "[", "z", "8", "s", "d", "2", "5"]];

let mergerResult = a2.reduce((r, v) => [...v, ...r], []);

mergerResult = mergerResult.filter(value=>a1.includes(value));

console.log(mergerResult,'lenght',mergerResult.length);