获取对象的所有值,该对象的键以特定模式结束

时间:2015-12-28 06:43:25

标签: javascript jquery arrays object

我正在尝试从Object中检索所有键值,其中键名以(例如_abc)结束。

我的尝试

obj = {p1_abc: 1, p2_abc: 2, p3_def: 3, p4_abc: 4, p5_def: 5}

required_keys = jQuery.map(Object.keys(obj), function(val, i){
  if(val.indexOf("_abc") != -1)
    return val;
});
//required_keys = ['p1_abc', 'p2_abc', 'p4_abc']

required_values = jQuery.map(required_keys, function(v, i){
  return(obj[v]);
});
//required_values = [1, 2, 4]

此处, required_values 包含我需要的值,但我觉得整个代码有点难看。是否有一种清洁的方法来实现这一目标?

9 个答案:

答案 0 :(得分:2)

您应该使用reduce同时过滤和减少项目

var obj = {
  p1_abc: 1,
  p2_abc: 2,
  p3_def: 3,
  p4_abc: 4,
  p5_def: 5
}
var regex = /_abc$/;
var required_values = Object.keys(obj).reduce(function(sum, key) {
  if (regex.test(key)) {
    sum.push(obj[key]);
  }
  return sum;
}, []);

console.log(required_values);
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

答案 1 :(得分:2)

首先使用Object.keys()从对象获取所有属性,然后使用Array.prototype.filter()过滤数组以获取所需属性,最后使用对象的括号运算符从对象中收集所有值,并使用{返回{ {3}}一个不错的数组。

&#13;
&#13;
var obj = { p1_abc: 1, p2_abc: 2, p3_def: 3, p4_abc: 4, p5_def: 5, _abcp6: 6 },
    required_values = Object.keys(obj).filter(function (a) {
        return /_abc$/.test(a);
    }).map(function (a) {
        return obj[a];
    });

document.write('<pre>' + JSON.stringify(required_values, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

答案 2 :(得分:2)

有几分钟的时间,这似乎是一个很好的问题,介绍iterators

以下是用ES5编写的示例,但它也可以在加载了填充程序的ES3中使用。

function makeEntriesIterator(object) {
  var keys = Object.keys(object);
  var nextKey = 0;
  return {
    next: function next() {
      if (nextKey < keys.length) {
        var key = keys[nextKey];
        var iterator = {
          value: [key, object[key]],
          done: false
        };
        nextKey += 1;
        return iterator;
      }
      return {
        value: undefined,
        done: true
      };
    }
  };
}

var obj = {
  p1_abc: 1,
  p2_abc: 2,
  p3_def: 3,
  p4_abc: 4,
  p5_def: 5
};

var iterator = makeEntriesIterator(obj);
var next = iterator.next();
var matches = [];
while (!next.done) {
  if (next.value[0].slice(-4) === '_abc') {
    matches.push(next.value);
  }
  next = iterator.next();
}
document.getElementById('out').textContent = JSON.stringify(matches, null, 2);
console.log(matches);
<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.4.1/es5-shim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/json3/3.3.2/json3.min.js"></script>

<pre id="out"></pre>

在ES6中,您可以使用for..of代替while,数组包含迭代器valuesentrieskeys,默认Symbol.iteratorvalues

'use strict';

const obj = {
  p1_abc: 1,
  p2_abc: 2,
  p3_def: 3,
  p4_abc: 4,
  p5_def: 5
};

const matches = [];
for (let key of Object.keys(obj)) {
  if (key.endsWith('_abc')) {
    matches.push([key, obj[key]]);
  }
}
document.getElementById('out').textContent = JSON.stringify(matches, null, 2);
console.log(matches);
<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.4.1/es5-shim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/json3/3.3.2/json3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.34.0/es6-shim.js"></script>
<pre id="out"></pre>

ES7将为对象引入迭代器,例如entries,然后事情变得更加清晰,因为您不需要使用Object.keys。但是现在还不能证明这一点。

'use strict';

const obj = {
  p1_abc: 1,
  p2_abc: 2,
  p3_def: 3,
  p4_abc: 4,
  p5_def: 5
};

const matches = [];
for (let [key, value] of obj) {
  if (key.endsWith('_abc')) {
    matches.push([key, value]);
  }
}

答案 3 :(得分:1)

尝试使用for..in循环RegExp.prototype.test()RegExp /_abc$/匹配以"_abc"

结尾的对象属性

&#13;
&#13;
var obj = {
  p1_abc: 1,
  p2_abc: 2,
  p3_def: 3,
  p4_abc: 4,
  p5_def: 5
};

for (prop in obj) {
  if (/_abc$/.test(prop))
    console.log(obj[prop]) // do stuff with `prop` , `obj[prop]`
}
&#13;
&#13;
&#13;

答案 4 :(得分:0)

您可以在一个.map()

中执行此操作

obj = {
  p1_abc: 1,
  p2_abc: 2,
  p3_def: 3,
  p4_abc: 4,
  p5_def: 5
}

required_keys = jQuery.map(Object.keys(obj), function(val, i) {
  if (val.indexOf("_abc") != -1) {
    return obj[val];
  }

});
document.write(required_keys);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

或者如果你想要键/值,你可以这样做

obj = {
  p1_abc: 1,
  p2_abc: 2,
  p3_def: 3,
  p4_abc: 4,
  p5_def: 5
}

required_keys = jQuery.map(Object.keys(obj), function(val, i) {
  if (val.indexOf("_abc") != -1) {
    return {[val]:obj[val]};
  }

});
document.write(JSON.stringify(required_keys));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

答案 5 :(得分:0)

当您标记Jquery时,您可以使用$.each()

var obj = {p1_abc: 1, p2_abc: 2, p3_def: 3, p4_abc: 4, p5_def: 5}
$.each(obj , function(k , v){
  if (k.indexOf("_abc") != -1){
        alert(v)
  };
})

Working Demo

返回数组

var obj = {p1_abc: 1, p2_abc: 2, p3_def: 3, p4_abc: 4, p5_def: 5}
var requireKeys = [];
$.each(obj , function(k , v){
  if (k.indexOf("_abc") != -1){
      requireKeys.push(v);
  };
})
alert(requireKeys);

Working Demo

答案 6 :(得分:0)

如果您有一个大型数据集,我会赞成“高性能”而不是“干净”。这不是“最干净”的代码,但它会比任何其他解决方案(迄今为止)更高效。

function getValues (obj) {
  var values = []
  for(var key in obj){
    if (key.substr(key.length - 4) === '_abc') {
      values.push(obj[key])
    }
  }
  return values
}

答案 7 :(得分:0)

这是findKey函数实现。

它返回第一个元素谓词的键,返回truthy而不是元素本身。

/**
 * @param {Object} collection The collection to inspect.
 * @param {Function} predicate The function.
 * @returns {*} Returns the key, else `undefined`. 
 */
var findKey = function(object, predicate) {
  let result;
  if (object == null) {
    return result;
  }
  Object.keys(object).some(function(key) {
    const value = object[key]
    if (predicate(value, key, object)) {
      result = key;
      return true;
    }
  })
  return result;
}

用法

//Example usage
var collections = {
  brand_category_3320: 1133,
  brand_category_3321: 2245
};

var r = findKey(collections, function(o, key, context) {
  if (key.indexOf(3320) > -1) {
    return true;
  }
  return false;
});

console.log('The r is =', r);

答案 8 :(得分:-1)

    obj = {
      p1_abc: 1,
      p2_abc: 2,
      p3_def: 3,
      p4_abc: 4,
      p5_def: 5
    }

    required_data = Object.keys(obj).map(function(val, i) {
      if (val.indexOf("_abc") != -1)
        return {
          [val]: obj[val]
        };
    });

    console.log(required_data);

将生成所需的新对象数组,并且可以删除jQuery。