确认数组

时间:2016-05-23 17:35:47

标签: javascript arrays

我在创建一个程序时遇到了很大困难,该程序根据我设置的规则检查数组中对象的出现次数。如果特定对象存在多于一个,我会计算出现次数。

示例输入:

[
  '{"NAME1":{"12":{"10":1}}}',
  '{"NAME1":{"12":{"10":1}}}',
  '{"NAME1":{"12":{"10":1}}}'
]

示例输出:

[
  '{"NAME1":{"12":{"10":3}}}'
]

警告:这是一个例子。

那么,我是怎么做的:

let SUPER = [
  {"NAME1":{"12":{"10":1}}},
  {"NAME1":{"12":{"10":1}}},
  {"NAME1":{"12":{"10":1}}},
  {"NAME1":{"12":{"10":1}}}
],
FINAL = [];

for (let _super of SUPER) {
  _super = JSON.stringify(_super);
  let ii = 0, ll = SUPER.length, number = 0;

  for (ii; ii < ll; ii++) {
    let current = JSON.stringify(SUPER[ii]);
    if (_super === current) {
      SUPER.splice(ii, 1);
      number++;
    }
  }

  if (number) {
    FINAL.push(function clone(destination, source) {
      destination = destination || {};
      for (var prop in source) {
        typeof source[prop] === 'object' && source[prop] !== null && source[prop]
                                                                                  ? destination[prop] = clone({}, source[prop])
                                                                                  : destination[prop] = number
        ;
      }
      return destination;
    }({}, JSON.parse(_super)));
  }
}

document.body.innerHTML = JSON.stringify(FINAL, null, 4);

所以,我循环遍历SUPER两次,一个在另一个内部来测试每个对象,如果我找到相同的字符串,我将数字增加一个并从数组中删除对象,然后我使用这个脚本将数字分配给对象的最内层属性:

  if (number) {
    FINAL.push(function clone(destination, source) {
      destination = destination || {};
      for (var prop in source) {
        typeof source[prop] === 'object' && source[prop] !== null && source[prop]
                                                                                  ? destination[prop] = clone({}, source[prop])
                                                                                  : destination[prop] = number
        ;
      }
      return destination;
    }({}, JSON.parse(_super)));
  }

但由于这一行存在冲突,因此无法正常工作:

    if (_super === current) {
      SUPER.splice(ii, 1);
      number++;
    }

我弄乱了循环。任何想法如何解决?我愿意接受建议,我不知道是否有更好的方法来实现这一点,我希望有人知道。

感谢。

3 个答案:

答案 0 :(得分:0)

拼接数组时,元素向左移动1,但循环索引继续向前移动而不考虑此移位。您可以通过每次拼接时将当前循环索引减1来解释它。

e.g: t = [1,2,3,4];

的console.log(T [1]); //输出:2

//拼接时

t.splice(1,1);

//拼接后,数组元素被移位

的console.log(T [1]); //输出:3

工作解决方案:

let SUPER = [{
    "NAME1": {
      "12": {
        "10": 1
      }
    }
  }, {
    "NAME1": {
      "12": {
        "10": 1
      }
    }
  }, {
    "NAME1": {
      "12": {
        "10": 1
      }
    }
  }, {
    "NAME1": {
      "12": {
        "10": 1
      }
    }
  }],
  FINAL = [];

for (let i = 0; i < SUPER.length; i++) {
  let _super = JSON.stringify(SUPER[i]),
    ii = i + 1,
    ll = SUPER.length,
    number = 1;

  for (ii; ii < ll; ii++) {
    let current = JSON.stringify(SUPER[ii]);
    if (_super === current) {
      SUPER.splice(ii, 1);
      ii--;
      number++;
    }
  }

  if (number) {
    FINAL.push(function clone(destination, source) {
      destination = destination || {};
      for (var prop in source) {
        typeof source[prop] === 'object' && source[prop] !== null && source[prop] ? destination[prop] = clone({}, source[prop]) : destination[prop] = number;
      }
      return destination;
    }({}, JSON.parse(_super)));
  }
}

document.body.innerHTML = JSON.stringify(FINAL, null, 4);

我还初始化了ii,数字为1以减少内循环的一次迭代。

答案 1 :(得分:0)

尝试编写自己的equals函数,并找到数组中出现的函数。

答案 2 :(得分:0)

如果您是动态设置&#34;通过两种Object方法的发明,改变规则然后执行这项工作非常容易;即Object.prototype.getNestedValue()Object.prototype.setNestedValue()。我们开始做吧。两种方法都采用了许多参数,这些参数是对象属性(如果参数是"string"类型)或数组索引(如果参数是"number"类型)。除此之外,在Object.setNestedValues()中,最后一个参数是要设置的值。简单。

所以这就是这样;

&#13;
&#13;
Object.prototype.getNestedValue = function(...a) {
  return a.length > 1 ? (this[a[0]] !== void 0 && this[a[0]].getNestedValue(...a.slice(1))) : this[a[0]];
};
Object.prototype.setNestedValue = function(...a) {
  return a.length > 2 ? typeof this[a[0]] === "object" && this[a[0]] !== null ? this[a[0]].setNestedValue(...a.slice(1))
                                                                              : (this[a[0]] = typeof a[1] === "string" ? {} : new Array(a[1]),
                                                                                 this[a[0]].setNestedValue(...a.slice(1)))
                      : this[a[0]] = a[1];
};

var data = [
  '{"NAME1":{"12":{"10":1}}}',
  '{"NAME1":{"12":{"10":1}}}',
  '{"NAME1":{"12":{"10":1}}}'
],
   props = ["NAME1", "12", "10"], // this array is constructed dynamically !!
 reduced = [data.reduce((p,c) => {var v = p.getNestedValue(...props);
                                  p.setNestedValue(...props, !!v ? ++v : 1);
                                  return p;},{})];
console.log(JSON.stringify(reduced,null,2));
&#13;
&#13;
&#13;