Есть ли встроенный способ соединения двух массивов в ColdFusion, аналогичный array.concat()
в JavaScript?
Объединение двух массивов в ColdFusion
Ответы (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
removeAll
, retainAll
и т. д., заключается в том, что методы Java не такие мягкие, как ваша типичная функция CF. Обычно они чувствительны к типу данных. Таким образом, "2"
(строка) и val(2)
(число) считаются разными значениями/элементами. Если вы абсолютно не уверены, что типы данных в обоих массивах совпадают, вам лучше использовать другие методы IMO.
- person Leigh; 25.08.2012
CF10+, использовать
arrayAppend(array1, array2, true);
https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-ab/arrayappend.html
Если вы используете Railo, вы можете использовать ArrayMerge (например, <cfset NewArray=ArrayMerge(FirstArray,SecondArray)>
).
Довольно глупо, что в 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>
В CF 10 или Railo 4 вы можете использовать функцию concat() из библиотеки Underscore.cfc чтобы получить новый массив, представляющий собой конкатенацию двух других массивов (без изменения существующих массивов). Пример скрипта:
newArray = _.concat([1], [2]);
Результат:
// newArray == [1, 2]
Использование этого метода для получения нового массива немного чище, чем создание нового массива и двукратный вызов ArrayAppend для него.
(Отказ от ответственности: я написал Underscore.cfc)
В 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>
Вы можете легко объединить два списка следующим образом:
<cfset combolist = ListAppend(lista,listb, ",")>
Итак, сначала преобразуйте два ваших массива в списки, используя ArrayToList()
. Объедините два списка с помощью ListAppend(), а затем преобразуйте ответ обратно в массив с помощью ListToArray()
.
Я не знаю, насколько это эффективно, но код очень прост. Я бы хотел использовать arrayAppend(), но я использую ColdFusion 8.
,
. т.е. единственное значение arr[1] ="Doe, John"
станет arr[1] = Doe, arr[2] = John
.
- person Leigh; 13.03.2013
~!
означает, что 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>
Да, в ColdFusion(10+) есть встроенная функция добавления двух массивов.
Версия сценария: array1.append(array2, true);
Отметить версию: arrayAppend(array1, array2, true);