如何在不更改属性的数据类型的情况下推送对象数组?

时间:2016-02-19 06:56:08

标签: javascript loops object

function where(collection, source) {
 var arr = [];

 for (var p in collection) {
    for (var x in source) {
        if (collection[p].hasOwnProperty(x)) {
            if (collection[p][x] === source[x]) {
                arr.push(collection[p]);
                break;
            }
            }
        }
    }
for (var i in arr) {
    if (Object.keys(arr[i]).length < Object.keys(source).length) {
        delete arr[i];
    }
}
  return arr;
  }

where([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], {"a": 1, "b": 2 });

第一个循环中的arr.push将对象放入数组中,但更改属性使它们不再是字符串 - 来自"a":1 to a:1.我需要引号在属性周围完好无损。

在寻找解决方案时,我遇到了一些信息,其中将对象推入数组,它只引用对象本身,而不是直接将其复制到数组中。

这里有任何想法吗?谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

Javascript对象将字符串作为属性。

您可以在推送新对象后检查其类型来验证这一点。

Object.keys({ "a": 1, "b": 2 })
  .map(prop => typeof prop);
// ["string", "string"]

控制台显示它们没有引号,因为它已经暗示它们是字符串。

ES2015引入了计算属性作为替代方案,但它们的语法明显不同。

var str = 'a';
var obj = { [a]: 1 };

答案 1 :(得分:0)

也许在将它推送到数组之前创建一个新的对象文字?

像...一样的东西。

if (collection[p][x] === source[x]) {
  var foo = new Object;

  // for all keys and values of collection[p]
  foo[*collection[p] property as string*] = *collection[p] property value*
  ...

  arr.push(foo);

  break;
}