คอนโซลนักพัฒนา Chrome JavaScript: สามารถเรียก console.log () โดยไม่ขึ้นบรรทัดใหม่ได้หรือไม่


93

ฉันต้องการใช้ console.log () เพื่อบันทึกข้อความโดยไม่ต้องต่อท้ายบรรทัดใหม่หลังจากการเรียกแต่ละครั้งไปที่ console.log () เป็นไปได้หรือไม่


10
หนึ่งในคำตอบถูกต้องหรือไม่?
newenglander

ฉันคิดว่าคำตอบของ @minitech ถูกต้อง: เป็นไปไม่ได้ คำตอบอื่น ๆ ให้สิ่งที่น่าสนใจหากมีความลึกเชิงมุมกับความเข้าใจของเราเกี่ยวกับ console.log ()
Dave Land

1
@DaveLand ผมเชื่อว่ามันเป็นที่ดีที่สุดที่เป็นไปได้โดยการรักษาบัฟเฟอร์การแสดงผลของคุณเองและการซิงค์ที่บัฟเฟอร์การแสดงผลไปยังคอนโซลที่เกิดขึ้นจริงจากการรวมกันของและเช่นconsole.clear() console.log()
John Weisz

1
@JohnWeisz: ขอบคุณ แต่การล้างคอนโซลทั้งหมดสำหรับการอัปเดต "อินไลน์" ทุกครั้งไม่ใช่วิธีแก้ปัญหาสำหรับแอปพลิเคชันประมาณ 99% ยังมี Updoot
Dave Land

@DaveLand ใช่มันเหมือนแฮ็คมากขึ้นและตอนนี้ฉันมองไปรอบ ๆ ฉันก็รู้ว่ามีการเสนอมาก่อน ไม่ว่าจะด้วยวิธีใดก็มีประโยชน์ในบางครั้ง
John Weisz

คำตอบ:


45

ไม่เป็นไปไม่ได้ คุณจะต้องเก็บสตริงและเชื่อมต่อกันถ้าคุณต้องการทั้งหมดในบรรทัดเดียวหรือวางเอาต์พุตไว้ที่อื่น (เช่นหน้าต่างอื่น)


2
จริงๆแล้วมันเป็นไปได้ แต่อาจจะไม่ใช่สำหรับการใช้งานที่ทุกคนคิด ในกรณีของฉันฉันแค่พยายามพิมพ์คำถามเพื่อรับข้อมูลจากเทอร์มินัลบรรทัดคำสั่ง ดูคำตอบของคำถามนี้สำหรับคำตอบ: stackoverflow.com/questions/26683734/…
deltaray

2
@deltaray readline questionไม่ได้console.log. คำถามยังเกี่ยวกับคอนโซลเบราว์เซอร์ไม่ใช่ Node.js
Ry-

@minitech คุณสามารถใช้ตัวดำเนินการกระจายเพื่อพิมพ์ในบรรทัดเดียว ดูในตัวอย่าง jsfiddle.net/imranqau5373/7m65at9L/2
imran khan

@imrankhan: นั่นไม่ใช่สิ่งที่คำถามคือ applyผู้ประกอบการแพร่กระจายไม่ได้เพิ่มอะไรใหม่ที่นี่เทียบกับการส่งผ่านข้อโต้แย้งหลาย / ใช้
Ry-

40

ใน NodeJS คุณสามารถใช้ process.stdout.write และคุณสามารถเพิ่ม '\ n' ได้หากต้องการ

console.log(msg)เทียบเท่ากับprocess.stdout.write(msg + '\n').


15
NodeJS ไม่ใช่ Chrome คำตอบนี้ไม่เกี่ยวข้องกับคำถาม'คุณสามารถ console.log โดยไม่ต้องขึ้นบรรทัดใหม่ได้หรือไม่' .
Alex

17

ใช่เป็นไปได้ (ดูการสาธิตด้านล่าง) - โดยติดตั้งคอนโซลเสมือนของคุณเองที่ด้านบนของคอนโซลเบราว์เซอร์ดั้งเดิมจากนั้นซิงค์กับคอนโซลจริง

มันง่ายกว่าที่คิดไว้มาก:

  1. รักษาบัฟเฟอร์การแสดงผล (เช่นอาร์เรย์ของสตริงที่แสดงหนึ่งบรรทัดต่อหนึ่งบรรทัด)
  2. โทรconsole.clear()ก่อนเขียนเพื่อลบเนื้อหาก่อนหน้านี้
  3. โทรconsole.log()(หรือเตือนข้อผิดพลาด ฯลฯ ) เพื่อเติมเนื้อหาจากบัฟเฟอร์การแสดงผลของคอนโซล

อันที่จริงฉันทำแบบนี้มาระยะหนึ่งแล้ว การนำแนวคิดสั้น ๆ ไปใช้โดยพื้นฐานอาจเป็นสิ่งที่ต้องทำตามบรรทัดต่อไปนี้ แต่ยังสามารถทำให้เนื้อหาของคอนโซลเคลื่อนไหวได้:

// =================================================
// Rudimentary implementation of a virtual console.
// =================================================

var virtualConsole = {
    lines: [],
    currentLine: 0,
    log: function (msg, appendToCurrentLine) {
        if (!appendToCurrentLine) virtualConsole.currentLine++;
      
        if (appendToCurrentLine && virtualConsole.lines[virtualConsole.currentLine]) {
            virtualConsole.lines[virtualConsole.currentLine] += msg;
        } else {
            virtualConsole.lines[virtualConsole.currentLine] = msg;
        }
        
        console.clear();
        
        virtualConsole.lines.forEach(function (line) {
            console.log(line);
        });
    },
    clear: function () {
        console.clear();
        virtualConsole.currentLine = 0;
    }
}

// =================================================
// Little demo to demonstrate how it looks.
// =================================================

// Write an initial console entry.
virtualConsole.log("Loading");

// Append to last line a few times.
var loadIndicatorInterval = setInterval(function () {
    virtualConsole.log(".", true); // <- Append.
}, 500);

// Write a new line.
setTimeout(function () {
    clearInterval(loadIndicatorInterval);
    virtualConsole.log("Finished."); // <- New line.
}, 8000);

แน่นอนว่ามีข้อเสียเมื่อผสมกับการโต้ตอบกับคอนโซลโดยตรงและอาจดูน่าเกลียด - แต่แน่นอนว่ามีการใช้งานที่ถูกต้องซึ่งคุณไม่สามารถทำได้หากไม่มีมัน


2
นี่คือคำตอบที่ดีที่สุดที่นี่ คุณยังสามารถเริ่มต้นด้วย say max lines ที่ทำให้กองบันทึกสั้นเพียงพอเพื่อที่คุณจะได้ไม่ต้องบันทึกข้อมูลจำนวนมาก
Matt Way

16

คุณสามารถใส่สิ่งต่างๆได้มากargumentsเท่าที่คุณต้องการ:

console.log('hi','these','words','will','be','separated','by','spaces',window,document)

คุณจะได้รับผลลัพธ์ทั้งหมดในบรรทัดเดียวโดยมีการอ้างอิงวัตถุแบบอินไลน์จากนั้นคุณสามารถวางผู้ตรวจสอบได้จากที่นั่น


62
สิ่งนี้ตอบคำถามได้อย่างไร?
JohnAllen

16
ฉันคิดว่าคำตอบนี้มีประโยชน์

12
สิ่งนี้มีประโยชน์ แม้ว่าจะไม่ตอบคำถาม แต่ก็ให้คำตอบสำหรับสิ่งที่คนส่วนใหญ่กำลังมองหาเมื่อพบคำถามนี้
Sean Lynch

1
สาเหตุที่ต้องการพิมพ์โดยไม่ขึ้นบรรทัดใหม่คือไม่ทราบผลลัพธ์ต่อไปนี้ หรือลองนึกภาพ "แถบตัวโหลด" โดยใช้เช่นจุด
Karl Adler

การใช้หลายอาร์กิวเมนต์จะทำลายสไตล์ console.log เนื่องจากคุณสามารถจัดสไตล์ภายในอาร์กิวเมนต์แรกเท่านั้น
Qwerty

12

คำตอบสั้น ๆ คือไม่

แต่

หากกรณีการใช้งานของคุณเกี่ยวข้องกับการพยายามบันทึกข้อมูลที่เปลี่ยนแปลงตลอดเวลาในขณะที่หลีกเลี่ยง console-bloat วิธีหนึ่งในการบรรลุสิ่งนี้ (ในบางเบราว์เซอร์) คือการใช้console.clear()ก่อนเอาต์พุตแต่ละรายการ

function writeSingleLine (msg) {

  console.clear();
  console.log(msg);

}

writeSingleLine('this');
setTimeout( function () { writeSingleLine('is'); }, 1000);
setTimeout( function () { writeSingleLine('a'); }, 2000);
setTimeout( function () { writeSingleLine('hack'); }, 3000);

โปรดทราบว่าสิ่งนี้อาจทำให้ฟังก์ชันการบันทึกอื่น ๆ ที่เกิดขึ้นภายในแอปพลิเคชันของคุณเสียหาย

คำเตือน: ฉันจะจัดว่านี่เป็นแฮ็ก


3
แฮ็คมาก แต่ฉลาด หากคุณติดตามสิ่งที่บันทึกไว้ในคอนโซลแล้ว (พูดโดยการรักษาบัฟเฟอร์เสมือนบางประเภทไว้) คุณสามารถสร้างบัฟเฟอร์ใหม่และเพิ่มสตริงใหม่ทุกครั้งที่คุณล้าง
danShumway

2

หากจุดประสงค์เดียวของคุณเพื่อหยุดการพิมพ์ในหลายบรรทัดวิธีหนึ่งคือการจัดกลุ่มค่าหากคุณไม่ต้องการให้มันเติมเต็มคอนโซลทั้งหมดของคุณ

PS: -พบกันที่คอนโซลเบราว์เซอร์สำหรับเอาต์พุต

let arr = new Array(10).fill(0)


console.groupCollapsed('index')

arr.forEach((val,index) => {
  console.log(index)
})

console.groupEnd()

console.group

console.groupCollapsed


1

บางอย่างเกี่ยวกับความคิดของ @shennan:


1

รวบรวมผลลัพธ์ของคุณในอาร์เรย์จากนั้นใช้ฟังก์ชัน join กับตัวคั่นที่ต้องการ

function echo(name, num){
    var ar= [];
    for(var i =0;i<num;i++){
        ar.push(name);
    }
    console.log(ar.join(', '));
}

echo("apple",3)

ตรวจสอบArray.prototype.join () ด้วยสำหรับรายละเอียดโหมด

var elements = ['Fire', 'Wind', 'Rain'];

console.log(elements.join());
// expected output: Fire,Wind,Rain

console.log(elements.join(''));
// expected output: FireWindRain

console.log(elements.join('-'));
// expected output: Fire-Wind-Rain

0

คุณสามารถใช้ตัวดำเนินการกระจายเพื่อแสดงเอาต์พุตในบรรทัดเดียว คุณลักษณะใหม่ของจาวาสคริปต์ ES6 ดูตัวอย่างด้านล่าง

   for(let i = 1; i<=10; i++){
        let arrData = [];
        for(let j = 1; j<= 10; j++){
            arrData.push(j+"X"+i+"="+(j*i));
        }
        console.log(...arrData);
    }

ซึ่งจะพิมพ์ 1 ถึง 10 ตารางในบรรทัดเดียว


0

หากคุณต้องการตัวอย่างเช่นองค์ประกอบคอนโซลบันทึกอาร์เรย์โดยไม่ต้องขึ้นบรรทัดใหม่คุณสามารถทำได้เช่นนี้

const arr = [1,2,3,4,5];

Array.prototype.log = (sep='') => {
    let res = '';
    for(let j=0; j<this.lengthl j++){
        res += this[j];
        res += sep;
    }
    console.log(res);
}

// console loging

arr.log(sep=' '); // result is: 1 2 3 4 5 

-3
// Source code for printing 2d array
window.onload = function () {
    var A = [[1, 2], [3, 4]];
    Print(A);
}

function Print(A) {
    var rows = A.length;
    var cols = A[0].length;
    var line = "";
    for (var r = 0; r < rows; r++) {
        line = "";
        for (var c = 0; c < cols; c++) {
            line += A[r][c] + " ";
        }
        console.log(line);
    }
}

1
A.forEach(row => console.log(row.join(' ')))
vp_arth
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.