0

im trying to convert array of objects to string. I want to concatenate col3: "R20;R301". In debugging i can able to see concatenated string in obj before pushing. But after pushing, it shows only one string like R20.

var array1 = [
  { col1: 'ABC1+R2', col2: 'ABC', col3: 'R20'},
  { col1: 'ABC1+R3', col2: 'ABC', col3: 'R20'},
  { col1: 'ABC1+R2', col2: 'ABC', col3: 'R301'},
  { col1: 'ABC1+R3', col2: 'ABC', col3: 'R301'},
  { col1: 'CDE2+R4', col2: 'CDE', col3: 'R20'},
  { col1: 'CDE2+R5', col2: 'CDE', col3: 'R30'},
  { col1: 'RED4+R3', col2: 'RED', col3: 'D20'},
  { col1: 'GTR5+R2', col2: 'GTR', col3: 'R20'}];
  
var result = array1.reduce(function (r, a) {
    let obj = r.find(el => el.col2 === a.col2);
    const text1 = {
        "text1": a.col1
    };
    var text2 = a.col3;
    if (obj) {
        if (!obj.col1.find(el => el.text1 === text1.text1)) {
            obj.col1.push(text1);
        }
        if (obj.col3 !== text2) {
            text2 = obj.col3 + ";" + text2;
        }
    } else {
        obj = {
            col1: [text1],
            col2: a.col2,
            col3: text2
        }
        r.push(obj)
    }
    return r;
}, []);

console.log(result);

I tried the above script, but couldn't achieve. An expected output should be like below. Thanks in advance.

var result = [{
        "col1": [{
                "text1": "ABC1+R2"
            },
            {
                "text1": "ABC1+R3"
            }
        ],
        "col2": "ABC",
        "col3": "R20;R301"
    },
    {
        "col1": [{
                "text1": "CDE2+R4"
            },
            {
                "text1": "CDE2+R5"
            }
        ],
        "col2": "CDE",
        "col3": "R20"
    },
    {
        "col1": [{
            "text1": "RED4+R3"
        }],
        "col2": "RED",
        "col3": "D20"
    },
    {
        "col1": [{
            "text1": "GTR5+R2"
        }],
        "col2": "GTR",
        "col3": "R20"
    }
]
console.log(result);

1
  • Why isn't R20;R30 in the second col3 in the desired result? Commented Jan 19, 2022 at 4:54

1 Answer 1

1

When you assign text2 = obj.col3 + ";" + text2;, you never update obj.col3 to hold that concatenated string.

var array1 = [
  { col1: 'ABC1+R2', col2: 'ABC', col3: 'R20'},
  { col1: 'ABC1+R3', col2: 'ABC', col3: 'R20'},
  { col1: 'ABC1+R2', col2: 'ABC', col3: 'R301'},
  { col1: 'ABC1+R3', col2: 'ABC', col3: 'R301'},
  { col1: 'CDE2+R4', col2: 'CDE', col3: 'R20'},
  { col1: 'CDE2+R5', col2: 'CDE', col3: 'R30'},
  { col1: 'RED4+R3', col2: 'RED', col3: 'D20'},
  { col1: 'GTR5+R2', col2: 'GTR', col3: 'R20'}];

var result = array1.reduce(function(r, a) {
  let obj = r.find(el => el.col2 === a.col2);
  const text1 = {
    "text1": a.col1
  };
  var text2 = a.col3;
  if (obj) {
    if (!obj.col1.find(el => el.text1 === text1.text1)) {
      obj.col1.push(text1);
    }
    if (obj.col3 !== text2) {
      obj.col3 += ";" + text2;
    }
  } else {
    obj = {
      col1: [text1],
      col2: a.col2,
      col3: text2
    }
    r.push(obj)
  }
  return r;
}, []);

console.log(result);

Sign up to request clarification or add additional context in comments.

4 Comments

Oh yes.. Thanks for your suggestion. Im beginner in JavaScript array concepts. But here i want to avoid the duplicate concatenation. Instead of "col3": "R20;R301;R301", it should be "col3": "R20;R301".
Here Im using obj.col3 = Array.from(new Set(obj.col3.split(","))).toString(); it's working. But instead of "," if i use ";" its not working. may be ";" separator is an issue?
Use .join(';') to join it with ;.
yes, since its a string, i used replace instead of join. Thanks.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.