qm-bus
Version:
千米公有云业务组件库
224 lines (214 loc) • 5.7 kB
JavaScript
/**
* @name QM.Array
* @class
* @description 数组的一些方法
*/
var assign = require('object-assign')
var _Array = (module.exports = {}) //下面有一个Array的引用 , 不这样不行呀
_Array.mixin = function(arrays, v, propertyName, howMerge) {
var _this = arrays
if (_Array.isArray(v)) {
var res = []
v.forEach(function(item) {
var _arr = _Array.mixin(_this, item, propertyName, howMerge)
res = res.concat(_arr)
})
return res
}
if (typeof propertyName == 'function') {
var res = []
_this.forEach(function(t, k) {
if (propertyName(v, t)) {
if (typeof howMerge == 'function') {
_this[k] = howMerge(v, _this[k])
} else {
_this[k] = assign(_this[k], v)
}
res = res.concat([assign({}, _this[k])])
}
})
return res
}
var res = []
var i = _Array.indexOf(_this, v, propertyName)
if (i > -1) {
if (typeof howMerge == 'function') {
_this[i] = howMerge(v, _this[i])
} else {
_this[i] = assign(_this[i], v)
}
return (res = res.concat([assign({}, _this[i])]))
}
return res
}
_Array.upush = function(arrays, v, propertyName, isMerge) {
if (typeof v == 'function') {
arrays.push(v)
return arrays
} else if (typeof propertyName == 'function') {
var _this = arrays
_this.forEach(function(t, k) {
if (propertyName(v, t)) {
if (isMerge) {
_this[k] = assign(_this[k], v)
}
return _this
}
})
_this.push(v)
return _this
}
var i = _Array.indexOf(_this, v, propertyName)
if (i == -1) {
_this.push(v)
} else if (isMerge) {
_this[i] = assign(_this[i], v)
}
return _this
}
_Array.umerge = function(arrays, v, propertyName, isMerge) {
var _this = arrays
if (v instanceof Array) {
v.forEach(function(item) {
_Array.upush(_this, item, propertyName, isMerge)
})
} else {
_Array.upush(_this, v, propertyName, isMerge)
}
return _this
}
/**
*
* @param value
* @param propertyName 如何设置, 将会判断这个对象的属性值在这个数组里面是否有重复
* @returns
*/
_Array.indexOf = function(arrays, value, propertyName) {
var _this = arrays
var i
for (i = 0; i < _this.length; i++) {
if (!propertyName) {
var l = typeof _this[i] == 'string' ? _this[i].trim() : _this[i]
var r = typeof value == 'string' ? value.trim() : value
if (l == r) {
return i
}
} else if (propertyName) {
if (typeof propertyName == 'function') {
if (propertyName(value, _this[i])) {
return i
}
} else if (this.isArray(propertyName)) {
var allEq = true
for (var j = 0; j < propertyName.length; j++) {
var l =
typeof _this[i][propertyName[j]] == 'string'
? _this[i][propertyName[j]].trim()
: _this[i][propertyName[j]]
var r =
typeof value[propertyName[j]] == 'string'
? value[propertyName[j]].trim()
: value[propertyName[j]]
if (l != r) {
allEq = false
break
}
}
if (allEq) {
return i
}
} else {
var l =
typeof _this[i][propertyName] == 'string'
? _this[i][propertyName].trim()
: _this[i][propertyName]
var r =
typeof value[propertyName] == 'string' ? value[propertyName].trim() : value[propertyName]
if (l == r) {
return i
}
}
}
}
return -1
}
;(_Array.contain = function(arrays, obj, propertyName) {
if (typeof obj == 'function') return null
return _Array.indexOf(arrays, obj, propertyName) != -1
}),
(_Array.remove = function(arrays, val, propertyName) {
if (typeof val == 'function') return null
var i = _Array.indexOf(arrays, val, propertyName)
return i != -1 ? arrays.splice(i, 1) : []
})
_Array.treeSort = function(arrays, idProp, pidProp, startWith) {
var arrs = []
var _this = arrays
var children = (arr, pid, deep) => {
deep = deep || 0
var childList = []
arr.forEach((v, k) => {
if (v[pidProp] == pid) {
arrs.push(v)
childList.push(v)
var child = children(arr, v[idProp], deep + 1)
if (!child.length) {
v.NODE_LEAF = true
}
v.NODE_DEEP = deep + 1
}
})
return childList
}
children(_this, startWith || 0)
return arrs
}
_Array.tree = function(arrays, idProp, pidProp, startWith, process) {
var arrs = []
var _this = arrays
var children = (_arr, pid, deep, pos) => {
deep = deep || 0
pos = pos || [0]
var childList = []
if (_arr && _arr instanceof Array) {
_arr.forEach(v => {
if (v[pidProp] == pid) {
var _pos = [].concat(pos)
_pos.push(childList.length)
v.NODE_POSITION = _pos
var child = children(_arr, v[idProp], deep + 1, [].concat(_pos))
v.childNodes = child
if (!child.length) {
v.NODE_LEAF = true
}
v.NODE_DEEP = deep + 1
process && process(v)
childList.push(assign({}, v))
}
})
}
return childList
}
return children(_this, startWith || 0)
}
/**
* 判断是不是数组
*
* @param arr
* @returns {boolean}
*/
_Array.isArray = function(arrays) {
return Object.prototype.toString.call(arrays) === '[object Array]'
}
/**
* 获取数组中的元素
*/
_Array.get = function(arr, propertyValue, propertyName) {
var val = null
arr.map(function(v, k) {
if (v[propertyName] == propertyValue) {
val = v
}
})
return val
}