01/10/2018, 14:53

Chuyển chuỗi thành mảng

Mình có một chuỗi
str="add,a,b,c,d,a,b,e,f";
Giờ mình muốn chuyển nó thành

ar=[
{ten:'a',solg:2},
{ten:'b',solg:2},
{ten:'c',solg:1},
{ten:'d',solg:1},
{ten:'e',solg:1},
{ten:'f',solg:1},
]

Có anh chị em nào giúp với? bằng javascript.
cám ơn trước.

Vô Thin viết 17:00 ngày 01/10/2018

Dùng method split nhé bạn:

var ar = str.split(",");

Thuc Nguyen Tan viết 17:02 ngày 01/10/2018

còn cái đếm thì thế nào bạn?

function get_ds(){
    var str="hehe,a,a,b,c,b,d,e";
    var ar=str.split(',');
    ar.splice(0,1);//bỏ giá trị đầu
    var kq=[];
    //cái này thế nào? sao nỡ stop đúng lúc quan trọng
    return kq;
}
Nguyễn Duy Hùng viết 16:56 ngày 01/10/2018
function count(arr) {
  return arr.reduce((prev, curr) => (prev[curr] = ++prev[curr] || 1, prev), {})
}

console.log(count(data))
stackoverflow.com
Jack W

Counting the occurrences / frequency of array elements

javascript, arrays, count, element
asked by Jack W on 06:32PM - 14 Apr 11
Thuc Nguyen Tan viết 16:54 ngày 01/10/2018

uh, exellent!!!
Đọc không hiểu nhưng ra kết quả!!!

const data = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4]
function count(arr) {
  return arr.reduce((prev, curr) => (prev[curr] = ++prev[curr] || 1, prev), {})
}
console.log(count(data))

/*    
result:
{
  "2": 5,
  "4": 1,
  "5": 3,
  "9": 1
}
*/
rogp10 viết 16:53 ngày 01/10/2018

Cơ bản:
a.reduce((sum, curr) => sec_sum, 0); hay a.reduce(f, 0);
hay sum = 0; for v in a sum = f(sum, curr);

MDN Web Docs

Array.prototype.reduce()

The reduce() method applies a function against an accumulator and each element in the array (from left to right) to reduce it to a single value.

Thuc Nguyen Tan viết 16:53 ngày 01/10/2018

hix,

Bốc một thằng ra
Repeat
Xét với các thằng còn lại nếu giống thì tăng đếm, đá nó ra khỏi mảng

Thuc Nguyen Tan viết 16:57 ngày 01/10/2018

Hay bạn

var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];

var countedNames = names.reduce(function (allNames, name) { 
  if (name in allNames) {
    allNames[name]++;
  }
  else {
    allNames[name] = 1;
  }
  return allNames;
}, {});
// countedNames is:
// { 'Alice': 2, 'Bob': 1, 'Tiff': 1, 'Bruce': 1 }
Thuc Nguyen Tan viết 17:06 ngày 01/10/2018

Nếu không có cái này thực sự tui đổ mồ hôi hột code lên đến 30 dòng, !!!

Cái này thực sự là gì mà ảo diệu thế bạn?

rogp10 viết 16:53 ngày 01/10/2018

Cái này được “bưng” từ bên lập trình hàm qua, cùng với arrow function (tên cúng cơm là anonymous function).

Thuc Nguyen Tan viết 17:06 ngày 01/10/2018

Có phải nó gọi là es5 gì đó không?
Hình như nó đâu có thuần của javascript, bởi vì nếu không có es5 thì nó không chạy?

rogp10 viết 16:53 ngày 01/10/2018

*oops* Anonymous là từ ES5, còn viết kiểu arrow là ES6 mới có.

Thuc Nguyen Tan viết 17:06 ngày 01/10/2018

Mình có biết đâu, của cái bạn banhmisg9509 search ra đấy, mình cũng không quan tâm, Bạn code rõ ràng hơn đấy, mình chỉ thích rõ ràng.

Hay là level expert họ thích thế nhỉ!

Zhang Jike viết 17:08 ngày 01/10/2018

Cú pháp reduce có gì không rõ ràng. Bạn lười tìm hiểu và thích đồ ăn sẵn thì đúng hơn.

rogp10 viết 16:56 ngày 01/10/2018

Chỗ mình vẫn chưa hiểu là ++prev[curr] khi prev[curr] còn chưa tồn tại.

Zhang Jike viết 17:01 ngày 01/10/2018

nếu prev[curr] chưa tồn tại thì ++prev[curr] == NaNNaNfalsy => prev[curr] = ++prev[curr] || 1 trả đúng giá trị rồi

Thuc Nguyen Tan viết 17:00 ngày 01/10/2018

Giả sử như không dùng cái reduce kia thì thông thường viết thế nào, anh chị em viết chơi cho vui,
Xem như template sau:

function count_name(){
      var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
      var kq={};

      //code here

      return kq;
}
Zhang Jike viết 17:05 ngày 01/10/2018

Bạn nào thấy vui thì viết đi kìa. Mình k thấy vui

Thuc Nguyen Tan viết 17:05 ngày 01/10/2018

Mình sử dụng phương pháp đánh dấu

Thuc Nguyen Tan viết 16:56 ngày 01/10/2018

Đây là phương pháp thứ hai đầy hình ảnh

  1. Close your eyes

  2. Imagination that you have two tupe of tenis balls, the right is contain 4 ball, the left is empty.

  3. Pick up one ball on the top of the right tupe, call it is current ball

  4. Repeat

    –pick up one ball in the right,
    –if it like current ball then throw out, else push it in to the left
    // collect data here
    until the right is empty

5, pour the left to the right
6. Repeat from 3 to 5 until the left is empty.

viết 16:58 ngày 01/10/2018
function count_name(names) {
  var kq = new Map();
  names.forEach(function(item) {
    if (!kq.has(item)) kq.set(item, 0);
    kq.set(item, kq.get(item) + 1);
  });
  return kq;
}
function logMapElements(value, key) {
  console.log(`m[${key}] = ${value}`);
}
countName(['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']).forEach(logMapElements);
Bài liên quan
0