在数组上使用 hasOwnProperty()
Using hasOwnProperty() on an array
我可以在数组上使用 hasOwnProperty() 吗?我有这个 RGBA 值数组:
colors = [[240,120,120,255], [125,222,111,255], [9,56,237,255], [240,120,120,255], [240,120,120,255], [240,120,120,255]]
我想创建一个对象,按照它们在数组中出现的频率对它们进行排序。我正在尝试组合。
首先我想到使用以下方法将数组转换为对象:
function toObject(arr) {
var rv = {};
for (var i = 0; i < arr.length; ++i){
rv[i] = arr[i];
}
//console.log('the array is now this ', rv)
return rv;
}
但是 returns 是这样的:
{0: [240,120,120,255], 1:[125,222,111,255],2:[9,56,237,255], 3:[240,120,120,255], 4:[240,120,120,255], 5:[240,120,120,255]}
所以我想知道我是否可以像这样调用它的 hasOwnProperty?
function reduceColors(passedArray){
var empty = {}
return passedArray.filter(function(item){
return empty.hasOwnProperty(item["value"])
})
}
您可以为此使用哈希。
通过散列,您可以将具有相同值的数组按相同的顺序分组,并且可以计算它们的频率。
这是一个例子:
var colors = [[240,120,120,255], [125,222,111,255], [9,56,237,255], [240,120,120,255], [240,120,120,255], [240,120,120,255]];
var hashed = [];
colors.forEach(function(arr){
var id = hash(arr);
var contains = hashed.find(v => v.id == id);
if(contains){
contains.count++;
}else{
hashed.push({id:id, color:arr, count:1});
}
});
hashed.sort(function(a,b){return b.count - a.count;})
console.log(hashed);
function hash(arr){
var hash = "#";
arr.forEach(function(v){
hash+=v.toString(16);
});
return hash;
}
在这个例子中,我通过将 RGBA 值转换为十六进制数来创建散列,但更好的解决方案是像那样存储它们(十六进制),因此您将得到一个一维数组一个二维数组。
您可以使用 for
循环、Array.prototype.filter()
、Array.prototype.every()
和严格相等运算符来检查 colors
中的每个数组是否包含兄弟元素的每个元素colors
内相同索引的数组;将每个匹配的兄弟数组连接到一个输出数组
colors = [
[240, 120, 120, 255],
[125, 222, 111, 255],
[9, 56, 237, 255],
[240, 120, 120, 255],
[240, 120, 120, 255],
[240, 120, 120, 255]
]
var res = [];
for (var i = 0; i < colors.length; i++) {
if (res.length < colors.length) {
[...res] = [...res,
...colors.filter(function(el) {
return el.every(function(elem, index) {
return elem === colors[i][index]
})
})
]
} else {
break;
}
}
console.log(res);
我可以在数组上使用 hasOwnProperty() 吗?我有这个 RGBA 值数组:
colors = [[240,120,120,255], [125,222,111,255], [9,56,237,255], [240,120,120,255], [240,120,120,255], [240,120,120,255]]
我想创建一个对象,按照它们在数组中出现的频率对它们进行排序。我正在尝试组合。
首先我想到使用以下方法将数组转换为对象:
function toObject(arr) {
var rv = {};
for (var i = 0; i < arr.length; ++i){
rv[i] = arr[i];
}
//console.log('the array is now this ', rv)
return rv;
}
但是 returns 是这样的:
{0: [240,120,120,255], 1:[125,222,111,255],2:[9,56,237,255], 3:[240,120,120,255], 4:[240,120,120,255], 5:[240,120,120,255]}
所以我想知道我是否可以像这样调用它的 hasOwnProperty?
function reduceColors(passedArray){
var empty = {}
return passedArray.filter(function(item){
return empty.hasOwnProperty(item["value"])
})
}
您可以为此使用哈希。 通过散列,您可以将具有相同值的数组按相同的顺序分组,并且可以计算它们的频率。
这是一个例子:
var colors = [[240,120,120,255], [125,222,111,255], [9,56,237,255], [240,120,120,255], [240,120,120,255], [240,120,120,255]];
var hashed = [];
colors.forEach(function(arr){
var id = hash(arr);
var contains = hashed.find(v => v.id == id);
if(contains){
contains.count++;
}else{
hashed.push({id:id, color:arr, count:1});
}
});
hashed.sort(function(a,b){return b.count - a.count;})
console.log(hashed);
function hash(arr){
var hash = "#";
arr.forEach(function(v){
hash+=v.toString(16);
});
return hash;
}
在这个例子中,我通过将 RGBA 值转换为十六进制数来创建散列,但更好的解决方案是像那样存储它们(十六进制),因此您将得到一个一维数组一个二维数组。
您可以使用 for
循环、Array.prototype.filter()
、Array.prototype.every()
和严格相等运算符来检查 colors
中的每个数组是否包含兄弟元素的每个元素colors
内相同索引的数组;将每个匹配的兄弟数组连接到一个输出数组
colors = [
[240, 120, 120, 255],
[125, 222, 111, 255],
[9, 56, 237, 255],
[240, 120, 120, 255],
[240, 120, 120, 255],
[240, 120, 120, 255]
]
var res = [];
for (var i = 0; i < colors.length; i++) {
if (res.length < colors.length) {
[...res] = [...res,
...colors.filter(function(el) {
return el.every(function(elem, index) {
return elem === colors[i][index]
})
})
]
} else {
break;
}
}
console.log(res);