使用push()方法时如何避免2D数组中出现重复项?

时间:2018-08-15 00:52:17

标签: javascript arrays

我有一个简单的代码,它接收一个2d数组(使用getValues从Google表格中获取的交货报告)作为输入,根据某些条件对项目进行计数并将这些计数推入另一个数组。

2d输入数组(交货报告)中的每个元素都由带有与两种可能类型的已交货项目有关的信息的vendorID组成。交付的每个项目都是一个单独的元素(报告上的单独行),即使对于相同的供应商ID也是如此。

vendorID1-项目-项目信息
vendorID1-项目-项目信息
vendorID1-项目-项目信息
vendorID2-物料-物料信息
vendorID2-物料-物料信息
...等等。

我的代码通过使用外部For循环从报告(数组[0] [0])中读取第一个vendorID来工作,然后遍历数组以使用内部For循环来寻找匹配的vendorID-如果满足Condition1,则递增Item1乘以1,如果满足Condition2,则将Item2乘以1。然后将(vendorID,Item1_count,Item2_count] []推入另一个数组。

我遇到的问题是,外循环的每次迭代最终都会将多个重复记录推入最终数组,因为输入数组(交付报告)中的每个供应商ID几乎总是有多个条目对应于每个交付的物品。

我需要找出一种跳过或忽略已计算的供应商ID的方法,以避免将相同的数据推入最终数组。

最初,我的代码将数据推送到一维数组中,并且我能够使用indexOf检查是否已推送了供应商ID,但是我更改了代码以创建2d数组,以实现更好的数据组织和indexOf作品。我想出了另一种解决方法,但是我不知道这是否是最好的解决方案,因为我是编码的新手。 我的另一种解决方案是创建另一个数组来保存已经计算的供应商ID,然后在该数组上使用indexOf来防止推送重复的条目。

任何帮助将不胜感激!

代码如下:

// Iterate through the array to get first/next vendorID on the list

for (var i=0; i<delivery_data.length; i++) {

  // Assign vendorID from input array (delivery report) to a variable
  var vendor_id = delivery_data[i][0];

  // Declare a variable to eventually hold vendorID counted last
  var last_counted_vendor;

  // Set item counts to 0

  var item1_count = 0;
  var item2_count = 0;

  // Execute inner For loop only if 
  // vendorID is not the same as previous iteration
  if (vendor_id != last_counted_vendor) {

  // I think j=i works and avoids searching from the 
  // beginning of the array every singe time
    for (var j=i; j<delivery_data.length; j++) {

      // If vendorID matches and condition1 is met, increment item1
      if (vendor_id == delivery_data[j][0] && condition1) {
      item1_count++;
      }
      // If vendorID matches and condition2 is met, increment item2
      else if (vendor_id == delivery_data[j][0] && condition2) {
        item2_count++;
      }
    }

   // Assign vendorID just counted to a variable
   last_counted_vendor = vendor_id;
   // Push vendorID and item counts to the final array
   count_data.push([vendor_id,item1_count,item2_count]);
  }
}

2 个答案:

答案 0 :(得分:2)

最简单的方法是到目前为止找到true$fisier = file_get_contents('urlproxy'); // Read the file with the proxy list $linii = explode("\n", $fisier); // Get each proxy $fisier = fopen("bune.txt", "a"); // Here we will write the good ones ,如果找到的Set已包含在{{1 }}:

vendor_id

答案 1 :(得分:1)

看起来您不必要地遍历了两次数组。对元素进行计数的一种典型方法是创建一个哈希映射,该映射将您的计数键控为某个ID。

换句话说,您将构建一个看起来像这样的对象:

class ViewModel {
    let inputs: [AnyObserver<String>]
    let outputs: [Observable<String>]

    init(count: Int) {
        let subjects = (0..<count).map { _ in BehaviorSubject<String>(value: "") }
        inputs = subjects.map { $0.asObserver() }
        outputs = subjects.map { $0.asObservable() }
    }
}

class ParentViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let bag = self.bag
        Observable.just(viewModel.inputs)
            .bind(to: tableView.rx.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { _, element, cell in
                let textField = cell.viewWithTag(99) as! UITextField
                textField.rx.text.orEmpty
                    .bind(to: element)
                    .disposed(by: bag)
            }
            .disposed(by: bag)
    }

    let bag = DisposeBag()
}

class ChildViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let bag = self.bag
        Observable.just(viewModel.outputs)
            .bind(to: tableView.rx.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { _, element, cell in
                element
                    .bind(to: cell.textLabel!.rx.text)
                    .disposed(by: bag)
            }
            .disposed(by: bag)
    }

    let bag = DisposeBag()
}

然后在map = { id1: [id, count1, count2], id2: [id, count1, count2] } 没有特定键的情况下循环遍历,这是您第一次看到它,并添加了数组并递增。如果确实存在,则只需增加所需的内容即可。

这是一个包含一些虚假数据的示例,其条件只是设置了map还是item info[1]。最后,item info[2]可以返回一个简单的计数数组:

Object.values

这使您的算法以线性时间而不是多项式时间运行,这几乎在所有情况下都会更快。