在Javascript中的对象数组中查找值

IT技术 javascript arrays
2021-01-27 19:29:15

我知道以前有人问过类似的问题,但这个问题有点不同。我有一个未命名对象数组,其中包含一个命名对象数组,我需要获取“名称”为“字符串 1”的对象。这是一个示例数组。

var array = [
    { name:"string 1", value:"this", other: "that" },
    { name:"string 2", value:"this", other: "that" }
];

更新:我应该早点说这个,但是一旦我找到它,我想用一个编辑过的对象替换它。

6个回答

查找数组元素:

let arr = [
    { name:"string 1", value:"this", other: "that" },
    { name:"string 2", value:"this", other: "that" }
];

let obj = arr.find(o => o.name === 'string 1');

console.log(obj);


替换数组元素:

let arr = [
    { name:"string 1", value:"this", other: "that" },
    { name:"string 2", value:"this", other: "that" }
];

let obj = arr.find((o, i) => {
    if (o.name === 'string 1') {
        arr[i] = { name: 'new string', value: 'this', other: 'that' };
        return true; // stop searching
    }
});

console.log(arr);

对于您的第二个示例,您应该将其arr作为回调函数的第三个参数。这就是它的意义所在。
2021-03-11 19:29:15
两个原因。首先,arr变量在外部作用域中可用的情况可能并不总是如此其次,它更快,因为它是一个局部变量。
2021-03-12 19:29:15
@AaditMShah 如果没有变量,那么是的,第三个参数可能很有用。但是因为我们在这种情况下有变量,所以不需要它。关于第二点,它在实践中并不快。1 微秒的改进甚至不值得谈论,更不用说为其创建代码了,恕我直言。
2021-04-03 19:29:15
@nishant 不需要。find方法自动为每个数组元素调用该函数,直到返回一个值。因此,如果该函数不返回任何内容,则返回值是undefined,这不是truthy,因此通常会为下一个元素调用该函数。
2021-04-07 19:29:15
@AaditMShah 我想知道这是什么意思。arr变量已在外部作用域中可用。
2021-04-08 19:29:15

您可以遍历数组并测试该属性:

function search(nameKey, myArray){
    for (var i=0; i < myArray.length; i++) {
        if (myArray[i].name === nameKey) {
            return myArray[i];
        }
    }
}

var array = [
    { name:"string 1", value:"this", other: "that" },
    { name:"string 2", value:"this", other: "that" }
];

var resultObject = search("string 1", array);
还有一个叫做超级阵列的小实用程序
2021-03-16 19:29:15
将函数更改为 thissearch(nameKey, prop, myArray)并将 if 子句更改为 thisif (myArray[i][prop]=== nameKey) {并搜索对象内的任何属性
2021-04-01 19:29:15
在整数值的情况下,使用 ==
2021-04-04 19:29:15

ES6 中,您可以Array.prototype.find(predicate, thisArg?)像这样使用

array.find(x => x.name === 'string 1')

http://exploringjs.com/es6/ch_arrays.html#_searching-for-array-elements https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/find

然后替换所述对象(并使用另一个很酷的ES6方法fill),您可以执行以下操作:

let obj = array.find(x => x.name === 'string 1');
let index = array.indexOf(obj);
array.fill(obj.name='some new string', index, index++);
如果它只是一个值,在这里,您也可以将其简写为: array.find(x => x.name === "string 1").name = "some new string";
2021-03-14 19:29:15
我在搜索如何在 Angular2 模板中使用 find 来设置属性时碰巧找到了这个答案。最后这篇文章很好地结合了 ES6 find 和管道... stackoverflow.com/questions/35986017/ ...
2021-03-26 19:29:15
我只能使用 == 而不是 === 来完成这项工作
2021-03-30 19:29:15
谢谢你。。!!!能够使用此代码从字面上找到数组中的某些内容,然后将其取出名称并使用变量...我将在下面发布我的答案
2021-03-31 19:29:15
已经有可用的findIndex方法返回索引而不是对象,从而避免indexOf再次使用
2021-04-05 19:29:15

根据 ECMAScript 6,您可以使用该findIndex函数。

array[array.findIndex(x => x.name == 'string 1')]
findIndex 是正确的解决方案。肯定不是foreach里面的foreach。这应该被接受的答案
2021-03-27 19:29:15
这个解决方案效果很好,简洁干净!
2021-03-29 19:29:15
使用 ES6,您可以.find()直接返回元素。.findIndex()不需要通过索引获取索引然后通过索引获取元素。
2021-03-30 19:29:15
var array = [
    { name:"string 1", value:"this", other: "that" },
    { name:"string 2", value:"this", other: "that" }
];

var foundValue = array.filter(obj=>obj.name==='string 1');

console.log(foundValue);
我正在寻找这种答案而不是最重要的答案。tnx :)
2021-03-10 19:29:15
filter 的问题在于它返回一个数组,而不是值!
2021-03-12 19:29:15
find() 方法返回集合中匹配的第一个值。一旦匹配结果中的值,它就不会检查数组集合中的剩余值。filter() 方法从集合中返回数组中匹配的值。
2021-03-15 19:29:15
'find' 是比 'filter' 更好的选择来查找特定对象
2021-03-26 19:29:15
为什么找到更好的选择,并且能够帮助找到特定的对象?不同之处在于它获取第一个对象与返回所有结果。find 不会告诉你有多少结果与字符串匹配。相反过滤器支持 IE 而 find 不支持
2021-04-02 19:29:15