4

我可以在数组上使用 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;
}

但这会返回如下内容:

 {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"])
    })
  }
4

2 回答 2

1

您可以为此使用散列。通过散列,您可以将具有相同值的数组按相同顺序分组,并且可以计算它们的频率。

这是一个例子:

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 值转换为十六进制数字来创建哈希,但更好的解决方案是像这样(以十六进制)存储它们,因此您将拥有一个一维数组而不是二维数组大批。

于 2016-10-02T23:04:20.103 回答
0

您可以使用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);

于 2016-10-02T23:12:21.760 回答