如何在javascript中迭代数组数组以获得常用项?

时间:2018-04-23 10:31:39

标签: javascript jquery

/*1 2 3
  2 1 3
  2 3 1 */

var arr = [

  [1,2,3],
  [2,1,3],
  [2,3,1]


]

function commonElementInColumn(arr){
  var a = arr[0],
      b=false,
      commItem =[];
  for(var i=0 ; i<a.length ;i ++){
    var item = a[i];
    for(j=1; j< arr.length ; j++){
      if(arr[j].indexOf(item) !==-1){
        b =true
      }else {
        b= false
      }
    }
    if(b){
      commItem.push(item)
    }
  }
  return commItem
}

console.log(commonElementInColumn(arr))

我正在尝试在矩阵中找到常见的column项。我试过这样。但没有得到预期的输出。我得到[1,2,3]但是 我们可以添加任何在列中找到共同元素的逻辑

预期输出 [1]

我想要m x n矩阵。我想找到所有coloum中存在的共同元素。

参见输入

/*1 2 3
  2 1 3
  2 3 1 */
  • 1出现在所有三栏中。

  • 2仅在third

  • 中排在第一位和第二位
  • 3出现在第二个和第三个,但不是第一个

4 个答案:

答案 0 :(得分:0)

尝试以下

var arr = [
  [1,2,3], [2,1,3], [2,3,1]
];

// Create the map of items with value to be an array of indexes
var map = {};
var result = [];

// iterate over the array
arr.forEach(function(subArray){
  subArray.forEach(function(item, index){
    map[item] = map[item] ? map[item] : [];
    // if the map has the item and the index already exists in the array, skip
    if(!map[item].includes(index)) {
      map[item].push(index);
    }
    // if the length is same as the array item length (assuming same for all subArray's) then it means all indexes have been covered
    if(map[item].length === arr[0].length) {
      result.push(item);
    }
  });
});

console.log(result);

答案 1 :(得分:0)

略有不同的方法,值为Map,每个值收集索引Set。稍后检查集合的大小,并将地图的键作为结果arrray。

&#13;
&#13;
function commonCol(array) {
    var map = new Map;
    array.forEach(a => a.forEach((v, i) => {
        if (!map.has(v)) {
            map.set(v, new Set);
        }
        map.get(v).add(i);
    }));

    return Array
        .from(map.entries())
        .filter(({ 1: v }) => v.size === array[0].length)
        .map(([k]) => k);
}

var array = [[1, 2, 3], [2, 1, 3], [2, 3, 1]];

console.log(commonCol(array));
&#13;
&#13;
&#13;

答案 2 :(得分:0)

在第一个子阵列上使用Array#filter(),因为它必须包含任何常用值。

在该过滤器中,使用Set将每个数字的所有索引传递给。由于Set必须具有唯一值,因此您可以检查它size,如果它与子阵列长度匹配,则所有索引都是唯一的

&#13;
&#13;
var arr = [
  [1, 2, 3],
  [2, 1, 3],
  [2, 3, 1]
]

function commonElementInColumn(arr) {  
  // return filtered results from first subarray since it has to contain any common values `
  return arr[0].filter((num) => {
    // get all indices for this number as array
    let indices = arr.map(subArr => subArr.indexOf(num));
    //create a set from this array which will void duplicates
    let uniqueIndices = new Set(indices);
    // if size of set is same as subarray length then all indices for this number are unique
    return uniqueIndices.size === arr[0].length;
  });

}

console.log(commonElementInColumn(arr))
&#13;
&#13;
&#13;

答案 3 :(得分:0)

看一下:

&#13;
&#13;
module rca_dataflow_tb(

reg [3:0] a,
reg [3:0] b,
reg cin,
reg [3:0] s,
reg cout

);

rca_dataflow uut(.a(a),.b(b),.cin(cin),.s(s),.cout(cout));

initial 
begin

#20
a = 4'b0;
b = 4'b0;
cin = 1'b0;
#20
if (s == 4'b0000 & cout == 1'b0) 
$display("Test Passed")
else 
$display("Test Failed")
end

#20
a = 4'b0010;
b = 4'b0000;
cin = 1'b0;
#20
if (s == 4'b0010 & cout == 1'b0)
$display("Test Passed")
else 
$display("Test Failed")
end


end
endmodule
&#13;
&#13;
&#13;