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.
85 lines
2.3 KiB
85 lines
2.3 KiB
10 years ago
|
/**
|
||
|
* 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;
|