Объединение двух массивов в ColdFusion

Есть ли встроенный способ соединения двух массивов в ColdFusion, аналогичный array.concat() в JavaScript?


person Yisroel    schedule 21.06.2010    source источник


Ответы (9)


Не совсем так, но угадайте, просто используйте Java! :)

<cfset foo = [1,2,3]>
<cfset bar = [4,5,6]>
<cfset foo.addAll( bar )>

ссылка: Коллекция Java API интерфейса.

источник: http://www.aliaspooryorik.com/blog/index.cfm/e/posts.details/post/merging-two-arrays-267

person Henry    schedule 21.06.2010
comment
Как ни странно, лежащие в основе методы Java не всегда работают должным образом. Я до сих пор не понял точно, когда и почему. Я часто использую методы Java для удаления дубликатов, объединения и сортировки массивов, я помню, что иногда это не срабатывало в зависимости от того, как вы создаете массивы, какие операции вы выполняете перед вызовом метода Java и т. д. Так что обратите внимание! - person zarko.susnjar; 22.06.2010
comment
@zarko.susnjar - я знаю, что это старая тема, но причина неожиданных результатов с такими методами, как removeAll, retainAll и т. д., заключается в том, что методы Java не такие мягкие, как ваша типичная функция CF. Обычно они чувствительны к типу данных. Таким образом, "2" (строка) и val(2) (число) считаются разными значениями/элементами. Если вы абсолютно не уверены, что типы данных в обоих массивах совпадают, вам лучше использовать другие методы IMO. - person Leigh; 25.08.2012
comment
Конечно, если вы в чем-то не уверены, всегда идите более безопасным и проверенным путем. - person zarko.susnjar; 29.08.2012
comment
Пользователь CF10+, пожалуйста, посмотрите мой другой ответ. - person Henry; 25.04.2014

CF10+, использовать

arrayAppend(array1, array2, true);

https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-ab/arrayappend.html

person Henry    schedule 04.06.2012
comment
+1, впечатляет, что вы вспомнили об этом вопросе и вернулись через два года, чтобы улучшить его. - person John; 16.11.2012

Если вы используете Railo, вы можете использовать ArrayMerge (например, <cfset NewArray=ArrayMerge(FirstArray,SecondArray)>).

person Gert Grenander    schedule 21.06.2010
comment
Я добавил в Adobe ColdFusion Bug Tracker в качестве запроса функции по адресу cfbugs. .adobe.com/cfbugreport/flexbugui/cfbugtracker/ . Голосуйте! :) - person Henry; 21.06.2010
comment
ArrayConcat против. ArrayMerge против ArrayAppend? Обсудите здесь: groups.google.com/group/cfml- общепринятая мудрость/browse_thread/ - person Henry; 21.06.2010

Довольно глупо, что в coldfusion отсутствуют многие базовые функции, которые можно было бы ожидать от языка сценариев. Вот один, который я должен был написать быстро.

<cffunction name="mergeArrays" returntype="array" >
    <cfargument name="array1" type="array" required="true" >
    <cfargument name="array2" type="array" required="true" >

    <cfset arrayResult = arrayNew(1) >
    <cfloop array="#array1#" index="elem">
        <cfset arrayAppend(arrayResult,elem) >
    </cfloop>

    <cfloop array="#array2#" index="elem">
        <cfset arrayAppend(arrayResult,elem) >
    </cfloop>

    <cfreturn arrayResult>
</cffunction>
person noj    schedule 01.02.2011

В CF 10 или Railo 4 вы можете использовать функцию concat() из библиотеки Underscore.cfc чтобы получить новый массив, представляющий собой конкатенацию двух других массивов (без изменения существующих массивов). Пример скрипта:

newArray = _.concat([1], [2]);

Результат:

// newArray == [1, 2]

Использование этого метода для получения нового массива немного чище, чем создание нового массива и двукратный вызов ArrayAppend для него.

(Отказ от ответственности: я написал Underscore.cfc)

person Russ    schedule 12.08.2012

В javascript array.join(s) создает строку из всех элементов массива, разделенных разделителем s. Аналогичной функцией в ColdFusion является функция ArrayToList. Что касается добавления массива к другому, я не верю, что для этого есть функция CF. Проверьте http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions-pt0_03.html#3473387, чтобы просмотреть список функций массива в CF. Или попробуйте что-то вроде этого:

<cfscript>
   for(index = 1; index LTE ArrayLen(array2); i = i + 1) {
      ArrayAppend(array1, array2[i]);
  }
</cfscript>
person Joel Anderson    schedule 23.06.2010

Вы можете легко объединить два списка следующим образом:

<cfset combolist = ListAppend(lista,listb, ",")>

Итак, сначала преобразуйте два ваших массива в списки, используя ArrayToList(). Объедините два списка с помощью ListAppend(), а затем преобразуйте ответ обратно в массив с помощью ListToArray().

Я не знаю, насколько это эффективно, но код очень прост. Я бы хотел использовать arrayAppend(), но я использую ColdFusion 8.

person Betty Mock    schedule 12.03.2013
comment
Просто имейте в виду, что это не полный эквивалент, так как он а) отбрасывает все пустые элементы массива и б) разделяет значения массива на любой используемый разделитель ,. т.е. единственное значение arr[1] ="Doe, John" станет arr[1] = Doe, arr[2] = John. - person Leigh; 13.03.2013
comment
Ли, ты делаешь хорошее замечание. Это можно обойти, используя другой разделитель списка, например ~~~ или ~!~!~! который вряд ли появится в массиве. - person Betty Mock; 14.03.2013
comment
Правда, несколько символов в этом случае не сработают. В большинстве версий CF несколько символов рассматриваются как отдельные разделители. т.е. ~! означает, что CF видит значения, разделенные ~ ИЛИ !. (Возможно, в CF10 все изменилось). Использование одного символа, например ascii 30, и сохранение пустого списка элементы, должны стать намного ближе. - person Leigh; 14.03.2013

Я взял это у Бена Наделя и использовал для шифрования и хеширования. Работал как шарм!

<cfscript>
    // Note: BinaryDecode/CharsetDecode return java arrays. 
    // Unlike CF arrays, java arrays are immutable, 
    // so the Java addAll(..) method to merge arrays won't work here. 
    // http://stackoverflow.com/a/10760835/104223

    // function to merge immutable arrays the long way
    function mergeArrays( array1, array2 ){
        var i = 0;
        var newArray = [];
        for (i = 1; i <= arrayLen(arguments.array1); i++) {
            arrayAppend(newArray, arguments.array1[i]);
        }
        for (i = 1; i <= arrayLen(arguments.array2); i++) {
            arrayAppend(newArray, arguments.array2[i]);
        }
        return newArray;
    }


    //convert the saltArray string and CustomerID string to UTF-8 byte arrays.
    saltByteArray = charsetDecode(salt, "utf-8");
    CustomerIdByteArray = charsetDecode(CustomerId, "utf-8");

    //create a new byte array consisting of the CustomerId bytes
    //appended with the salt bytes by merging the two binary arrays 
    //via custom function, mergeArrays
    mergedBytes = mergeArrays( CustomerIdByteArray, saltByteArray );
</cfscript>
person Faith Sloan    schedule 06.12.2012
comment
На самом деле я думаю, что вы получили это от меня, ха-ха .. и, глядя на эту ветку, я, вероятно, получил это из ответа @noj и переписал его в cfscript ;) - person Leigh; 07.12.2012

Да, в ColdFusion(10+) есть встроенная функция добавления двух массивов.

Версия сценария: array1.append(array2, true);

Отметить версию: arrayAppend(array1, array2, true);

person Chaitu    schedule 04.08.2020