1

How can I retrieve only unique array of this example.

"58|270,58|271,58|272,59|270,59|271,59|272"

I want this array to be stored like :

"58,270,271,272|59,270,271,272"

Can someone help me in ASP classic or VB script

2 Answers 2

1

This isn't a straight forward problem I found myself thinking about it for a few minutes before I finally thought of a way of doing it.

To produce the output from the input specified requires some sort of custom de-serialise / serialise approach. The code below creates a 2D array that will contain the unique indexes (58, 59 etc.) and populate them with a comma delimited list of the associated values (done it like this to make the serialise easy).

Structure wise it will look something like this when de-serialised

----- Array Debug ------
data(0, 0) = 58
data(1, 0) = 270,271,272
data(0, 1) = 59
data(1, 1) = 270,271,272

We then use that as the basis to build the serialised string in the format required.

'Function takes string input in the form <index>|<value>, ... extracts
'them into a 2D array groups duplicate indexes together.
Function DeserialiseToCustomArray(str)
  Dim a1, a2, x, y, idx
  If Len(str & "") > 0 Then
    a1 = Split(str, ",")
    ReDim data(1, 0)
    For x = 0 To UBound(a1)
      a2 = Split(a1(x), "|")
      If IsArray(data) Then
        idx = -1
        'Check for duplicates
        For y = 0 To UBound(data, 2)
          If data(0, y) = a2(0) Or IsEmpty(data(0, y)) Then
            idx = y
            Exit For
          End If
        Next

        'No duplicate found need to add a new element to the array.
        If idx = -1 Then
          idx = UBound(data, 2) + 1
          ReDim Preserve data(1, idx)
        End If
        data(0, idx) = a2(0)
        If IsEmpty(data(1, idx)) Then
          data(1, idx) = a2(1)
        Else
          data(1, idx) = Join(Array(data(1, idx), a2(1)), ",")
        End If
      End If
    Next
  End If
  DeserialiseToCustomArray = data
End Function

'Function takes a 2D array built from DeserialiseToCustomArray() and
'serialises it into a custom string in the form <index>,<value>, ... | ...
Function SerialiseArray(data)
  Dim x, y
  Dim str: str = Empty
  If IsArray(data) Then
    For y = 0 To UBound(data, 2)
      If y > 0 And y <= UBound(data, 2) Then str = str & "|"
      str = str & data(0, y) & "," & data(1, y)
    Next
  End If
  SerialiseArray = str
End Function

Couple examples of usage:

Dim str: str = "58|270,58|271,58|272,59|270,59|271,59|272"
Dim data, result

data = DeserialiseToCustomArray(str)
result = SerialiseArray(data)
WScript.Echo "input: " & str
WScript.Echo "output: " & result

Output:

Result: 58,270,271,272|59,270,271,272
Dim str: str = "58|270,58|271,58|272,59|270,59|271,59|272,60|345,61|345,58|270,60|200"
Dim data, result

data = DeserialiseToCustomArray(str)
result = SerialiseArray(data)
WScript.Echo "input: " & str
WScript.Echo "output: " & result

Output:

Result: 58,270,271,272,270|59,270,271,272|60,345,200|61,345

Note: If using these examples in Classic ASP remove the WScript.Echo and replace with Response.Write.

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

1 Comment

uh..thank you for take your time trying solve my problem..i m really appreciate it..this is what i need..thank u again...
0

A common way to get unique items from an array is to put them as keys into a Dictionary:

a = Array(58, 270, 271, 272, 270, 271, 272)

Set d = CreateObject("Scripting.Dictionary")
For Each i In a
  d(i) = True   'value can be anything, relevant is using i as key
Next

WScript.Echo Join(d.Keys, ",")  'Output: 58,270,271,272

Comments

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.