阵列组织

时间:2016-08-01 02:12:10

标签: javascript arrays for-loop

我一直在使用数组,我想要的是创建一个公式,允许我循环包含对象的数组并获取具有不同值的键并将它们转换为多维数组(I需要保持键的顺序)。我已经收到了这个数组,但现在我需要在字符串不相同的每个位置添加[' n / a',' - '],例如这样:

var all = [
  {banana: 1, rose: 2, mouse: 9, apple: 5, ana: 4, carl: 'truck'},
  {banana: 1, rock: 58, car: 19, apple: 5, cheese: 3, carl: 'blue'},
  {banana: 1, cheese: 2, red: 14, clue: 89, apple: 5, ana: 8}
];

//expected to get:
var new-arr = [ [["ana", 4], ["n/a", "--"], ["carl", "truck"]],
  ["n/a", "--"], ["cheese", 3], ["carl", "blue"]],
  [["ana", 8], ["cheese", 2], ["n/a", "--"]] ];

所以最后我会创建一个像这样的列表

list1的:

  • ana:4
  • 不适用: -
  • carl:truck

列表2:

  • 不适用: -
  • 奶酪:3
  • carl:blue

列表2:

  • ana:8
  • 奶酪:2
  • 不适用: -

代码在这里 https://jsbin.com/yedusigara/1/edit?js,console

我做错了什么吗?有什么方法可以在一个功能中完成所有操作吗?

1 个答案:

答案 0 :(得分:1)

你的错误没有显示在问题中,但它在小提琴中,在这一部分:

$('.lol').each(function (i, elm) {
similar_keys[i].forEach(function(spec, j){
  similar_keys[j].forEach(function (spec1, j1){
    if(spec[0] != spec1[0] && j != j1){
      similar_keys[i].push(['n/a', '--']);
    }
});

在第3个循环中迭代similar_keys [j]没有任何意义。 j是内部数组的索引。这段代码没有任何意义。您甚至依赖于DOM中的元素数量和数据中的对象。

我只能猜测你想要完成什么,但我会修改你原来的算法。也许这个:

function similars(arr) {
var similar_keys = [];
for (var i = 0; i < arr.length; i++) {
  var tempArr = [];
  for (var key in arr[i]) {
    var found = false;
    var count = 0;
    var index = 0;
    for (var j = 0; j < arr.length; j++) {
      if (arr[j].hasOwnProperty(key)) {
      ++count;
    }
    if (i !== j && arr[j][key] === arr[i][key]) {
     found = true;
     break;
     }
    }
    if (!found && count > 1) {
      tempArr.push([key, arr[i][key]]);
    }
    else if (count > 1) {
      tempArr.push(["N/A", arr[i][key]]);
    } 
  }
  similar_keys.push(tempArr);
}
return similar_keys;

}

编辑: 仍然不确定你在寻找什么。我认为你需要做的事情:

1)按第一个元素对similar_keys中的每一行进行排序 2)比较每行的第一个元素,并将N / A条目插入具有最低排序顺序的行。 3)继续通过每一列,必要时插入。

我会尝试修改你的小提示来演示

编辑: 这应该工作。 https://jsbin.com/nesiqogebo/edit?js,console,output