You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.3 KiB
84 lines
2.3 KiB
/** |
|
* Copyright 2013-2015, Facebook, Inc. |
|
* All rights reserved. |
|
* |
|
* This source code is licensed under the BSD-style license found in the |
|
* LICENSE file in the root directory of this source tree. An additional grant |
|
* of patent rights can be found in the PATENTS file in the same directory. |
|
* |
|
* @providesModule createArrayFromMixed |
|
* @typechecks |
|
*/ |
|
|
|
var toArray = require("./toArray"); |
|
|
|
/** |
|
* Perform a heuristic test to determine if an object is "array-like". |
|
* |
|
* A monk asked Joshu, a Zen master, "Has a dog Buddha nature?" |
|
* Joshu replied: "Mu." |
|
* |
|
* This function determines if its argument has "array nature": it returns |
|
* true if the argument is an actual array, an `arguments' object, or an |
|
* HTMLCollection (e.g. node.childNodes or node.getElementsByTagName()). |
|
* |
|
* It will return false for other array-like objects like Filelist. |
|
* |
|
* @param {*} obj |
|
* @return {boolean} |
|
*/ |
|
function hasArrayNature(obj) { |
|
return ( |
|
// not null/false |
|
!!obj && |
|
// arrays are objects, NodeLists are functions in Safari |
|
(typeof obj == 'object' || typeof obj == 'function') && |
|
// quacks like an array |
|
('length' in obj) && |
|
// not window |
|
!('setInterval' in obj) && |
|
// no DOM node should be considered an array-like |
|
// a 'select' element has 'length' and 'item' properties on IE8 |
|
(typeof obj.nodeType != 'number') && |
|
( |
|
// a real array |
|
(// HTMLCollection/NodeList |
|
(Array.isArray(obj) || |
|
// arguments |
|
('callee' in obj) || 'item' in obj)) |
|
) |
|
); |
|
} |
|
|
|
/** |
|
* Ensure that the argument is an array by wrapping it in an array if it is not. |
|
* Creates a copy of the argument if it is already an array. |
|
* |
|
* This is mostly useful idiomatically: |
|
* |
|
* var createArrayFromMixed = require('createArrayFromMixed'); |
|
* |
|
* function takesOneOrMoreThings(things) { |
|
* things = createArrayFromMixed(things); |
|
* ... |
|
* } |
|
* |
|
* This allows you to treat `things' as an array, but accept scalars in the API. |
|
* |
|
* If you need to convert an array-like object, like `arguments`, into an array |
|
* use toArray instead. |
|
* |
|
* @param {*} obj |
|
* @return {array} |
|
*/ |
|
function createArrayFromMixed(obj) { |
|
if (!hasArrayNature(obj)) { |
|
return [obj]; |
|
} else if (Array.isArray(obj)) { |
|
return obj.slice(); |
|
} else { |
|
return toArray(obj); |
|
} |
|
} |
|
|
|
module.exports = createArrayFromMixed;
|
|
|