使用数组方法时在哪里使用附加条件

问题描述

我正在尝试解决以下问题:

编写一个函数,如果所有数组元素均为true,则返回true。使用减少

这是我提出的解决方

function allTrue(values) {
  if ( values[0] === false) return false
  if (values.length === 0) return true
  let result = values.reduce( (final,value) => final = value === true,true) 
  return result ? true : false
}

我的问题是,是否可以将外部条件转移到reduce方法的主体中。

换句话说,如果要求我使用单一的reduce方法解决它,我可以实现它吗?

我尝试在reduce中操纵 final ,但是稍后在下一次迭代中会对其进行修改

例如,以下测试应返回 false 但返回true

allTrue([false,true])

任何解释将不胜感激,谢谢

解决方法

您的代码不起作用的原因是,reduce仅返回数组中的 last 元素与true的比较结果。由于[false,true]中的最后一个元素是true,因此它返回true

请注意,您的代码过于复杂,您已经将条件有效地包含在reduce中(赋予true的初始值意味着零长度数组将返回true )。您的一个问题是reduce中的代码不正确,您应该检查并同时检查 all 先前的值是否为true以及当前值是否为const allTrue = (values) => values.reduce((curr,value) => curr && value,true); console.log(allTrue([])); console.log(allTrue([true])); console.log(allTrue([false])); console.log(allTrue([true,true,true])); console.log(allTrue([false,true]));当前值以及所有先前值中的和:

package com.example.davincidrawingapp;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.Toast;

import com.example.davincidrawingapp.view.PikassoView;

public class MainActivity extends AppCompatActivity {

    private PikassoView pikassoView;
    private AlertDialog.Builder currentAlertDialog;
    private ImageView widthImageView;
    private AlertDialog dialogLineWidth;
    private AlertDialog colorDialog;

    private SeekBar alphaSeekbar1;
    private SeekBar redSeekBar;
    private SeekBar blueSeekBar;
    private SeekBar greenSeekBar;
    private View colorView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        pikassoView = findViewById(R.id.view);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu,menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {

        switch (item.getItemId())
        {
            case R.id.clearId:
                 pikassoView.clear();
                 break;

            case R.id.saveid:
                break;

            case R.id.colorid:
                showColorDialog();
                break;

            case R.id.lineWidth:
                showLineWidthDialog();
                break;

            case R.id.eraseid:
                break;
        }

        if (item.getItemId() == R.id.clearId) {
            pikassoView.clear();
        }


        return super.onOptionsItemSelected(item);
    }

    void showColorDialog()
    {
        currentAlertDialog = new AlertDialog.Builder(this);
        View view = getLayoutInflater().inflate(R.layout.color_dialog,null);
        alphaSeekbar1 = view.findViewById(R.id.alphaSeekbar1);
        redSeekBar= view.findViewById(R.id.redSeekbar);
        blueSeekBar= view.findViewById(R.id.blueSeekbar);
        greenSeekBar= view.findViewById(R.id.greenSeekbar);
        colorView = view.findViewById(R.id.colorView);

        //register Seekbar event listeners
        alphaSeekbar1.setOnSeekBarChangeListener(colorSeekBarChanged);
        redSeekBar.setOnSeekBarChangeListener(colorSeekBarChanged);
        blueSeekBar.setOnSeekBarChangeListener(colorSeekBarChanged);
        greenSeekBar.setOnSeekBarChangeListener(colorSeekBarChanged);

        int color = pikassoView.getDrawingColor();
        alphaSeekbar1.setProgress(Color.alpha(color));
        redSeekBar.setProgress(Color.red(color));
        greenSeekBar.setProgress(Color.green(color));
        blueSeekBar.setProgress(Color.blue(color));

        Button setColorButton = view.findViewById(R.id.setColorButton);
        setColorButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                pikassoView.setDrawingColor(Color.argb(
                        alphaSeekbar1.getProgress(),redSeekBar.getProgress(),greenSeekBar.getProgress(),blueSeekBar.getProgress()
                ));
             colorDialog.dismiss();
            }
        });

        currentAlertDialog.setView(view);
        currentAlertDialog.setTitle("Choose Color");
        colorDialog = currentAlertDialog.create();
        colorDialog.show();
    }


    private SeekBar.OnSeekBarChangeListener colorSeekBarChanged = new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar,int progress,boolean fromUser) {
        pikassoView.setBackgroundColor(Color.argb(
                alphaSeekbar1.getProgress(),blueSeekBar.getProgress()
        ));
            //display the current color
            colorView.setBackgroundColor(Color.argb(
                    alphaSeekbar1.getProgress(),blueSeekBar.getProgress()
            ));

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    };

    private SeekBar.OnSeekBarChangeListener widthSeekBarChange = new SeekBar.OnSeekBarChangeListener() {
        Bitmap bitmap = Bitmap.createBitmap(400,100,Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);

        @Override
        public void onProgressChanged(SeekBar seekBar,boolean fromUser) {
            Paint p = new Paint();
            p.setColor(pikassoView.getDrawingColor());
            p.setStrokeCap(Paint.Cap.ROUND);
            p.setStrokeWidth(progress);

            bitmap.eraseColor(Color.WHITE);
            canvas.drawLine(30,50,370,p);
            widthImageView.setImageBitmap(bitmap);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    };

    void showLineWidthDialog()
    {
        currentAlertDialog = new AlertDialog.Builder(this);
        View view = getLayoutInflater().inflate(R.layout.width_dialog,null);
        final SeekBar widthSeekbar = view.findViewById(R.id.widthseekBar);
        Button setLineWidthButton = view.findViewById(R.id.widthDialogButton);
        widthImageView = view.findViewById(R.id.imageViewid);
        setLineWidthButton.setOnClickListener(new View.OnClickListener()
                                              {
                                                  @Override
                                                  public void onClick(View view)
                                                  {
                                                      pikassoView.setLineWidth(widthSeekbar.getProgress());
                                                      dialogLineWidth.dismiss();
                                                      currentAlertDialog = null;
                                                  }
                                              }
        );

        widthSeekbar.setOnSeekBarChangeListener(widthSeekBarChange);
        currentAlertDialog.setView(view);
        dialogLineWidth = currentAlertDialog.create();
        dialogLineWidth.setTitle("Set Line Width");
        dialogLineWidth.show();
    }
}

,

我认为这会有所帮助:

function allTrue(values) {
  return values.reduce((final,value) => final && value)
}
,

我们也可以使用every来找到解决方案。以下是everyreduce

的代码段

var allTrue_Every = (arr) => arr.every(d => d == true)

console.log(allTrue_Every([true,true]))
console.log(allTrue_Every([true,false]))

var allTrue_Reduce = (arr) => arr.reduce((r,d) => r && d,true)


console.log(allTrue_Reduce([true,true]))
console.log(allTrue_Reduce([true,false]))